天天看點

Android應用接入第三方登入之新浪登入

衆所周知,移動網際網路在這幾年經曆了蓬勃發展,到目前為止,移動網際網路發展仍然很強勁。其中移動裝置系統以android占據主導地位,之前是加拿大的黑莓系統占據主導,但後來随着android系統的問世,黑莓手機作業系統逐漸被android蠶食,目前,全球最為流行的移動作業系統有Google公司的android、蘋果(Apple)公司的ios、微軟(Microsoft)公司的windows Phone,以上三者形成手機作業系統三足鼎立之勢,其中Google的android占據市場的百分之六十幾的份額,蘋果(Apple)占據百分之十八點幾的份額,而微軟(Microsoft)的Windows Phone占據全球僅僅隻有百分之三點幾的份額,好了,我們開始進入正題吧。

    随着3G手機的廣泛普及,移動應用開始了井噴式的發展,這些移動應用公司如雨後春筍越來越多,一些剛剛起來的小公司開發的應用(大部分一些電商、社交等之類的)為了提高其知名度,不得不依附大公司的龐大的使用者群來進行推廣,比如像騰訊(Tencent),新浪(sina),人人網,臉譜網(Facebook)等,這些公司提供接口API供開發者調用。今天呢,我要說的就是新浪登入,至于我為什麼要說新浪,是因為新浪寫的接口文檔太可惡了,走了不少彎路,為了大家少走彎路,我決定寫這篇博文,如果寫的不好,請批評指正[請不要帶有侮辱性的詞彙啊,望手下留情]!

    要想在移動應用上使用sina登入,第一步需要注冊成為開發者,說白了,就是一個新浪微網誌帳号,如果有了的話,就不要注冊了,直接登入即可,那麼在那裡去注冊成為開發者呢?下面的圖會告訴你:在位址欄中輸入 t.sina.com.cn --> 它會要求你登入(如果沒登入)

Android應用接入第三方登入之新浪登入

經過以上第一步,我們進入了新浪的開放平台,如圖:

Android應用接入第三方登入之新浪登入

第三步,建立應用,獲得授權資格,這裡需要你去填寫一些重要的資訊,這些東西在以後會用到,如圖(建立應用):

Android應用接入第三方登入之新浪登入

第四步,當我們點選了建立應用,你需要填寫以下資訊,如圖:

Android應用接入第三方登入之新浪登入

好了,現在剩下最後一步了,填寫完以上資訊之後,送出資訊,完了,此時還還會有些資訊需要你填寫,例如,回調位址,其實就是網站位址,可填新浪預設的,如果你自己有的話,也可以填寫你自己的網站位址,如圖:

Android應用接入第三方登入之新浪登入

記住,以上畫紅線部分,千萬不要洩露出去,因為會對公司造成安全隐患,特别是Android簽名、App Secret,如果App Secret不小心洩露出去的話,你可以點選該條目,進入編輯頁,進行重置,其中android簽名是根據新浪提供的一個app_signatures.apk生成的一串MD5加密字元串,然後填上去,就哦了!下面是一個示例,還要記住的是,要想使用此工具生成一串MD5加密字元串,那你就必須将該應用安裝到你的手機上,因為該MD5加密字元串是根據包名及xx.keystore生成的,Eclipse內建開發工具Run as 所使用的是debug.keystore 是以當你在釋出你的APP的時候,一定要根據你自己公司的 .keystore 生成MD5加密字元串填到android簽名哪一項上去,如果你填的是你通過Eclipse內建開發工具中的Run as 安裝到手機上去的debug.keystore生成的MD5加密字元串的話,那麼會導緻無法授權登入問題産生。是以,一旦你要釋出APP時,一定要更正回來,一般來說,一個公司keystore隻有一份,根據報名産生的MD5加密字元串效果圖如下:

Android應用接入第三方登入之新浪登入

哦,對了,在最後一步我們提到了回調位址,那麼該回調位址有什麼用呢?該回調位址相對使用者來說是不可見的,這個回調位址是用來生成accessToken的,通過這個accessToken可以去請求接口,獲得相關使用者的資訊。帶回一張圖就可以讓你明白,我上面所提到字段的意思。如圖:

Android應用接入第三方登入之新浪登入

完了,這就是新浪登入的過程,下面貼上一段代碼,第三方登入的代碼,這裡有一個請求接口的類,我覺得吧他寫成内部類更好一點,因為這樣可以更好的傳資料。特别提一點,我使用的SSO登入,我相信,Oauth2.0 認證應該是一樣的吧。

代碼:

public class LoginActivity extends BaseActivity implements OnClickListener {

	public static final int END_SINA = 2;
	private RelativeLayout third_party_login_xinlang;
	public String TAG = "LoginActivity---->";
	public static Oauth2AccessToken accessToken;
	private Weibo mWeibo;
	private SsoHandler mSsoHandler;
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			case END_SINA:
				Log.v(TAG, "sina data loded!!");
				isAlreadExist(LoginActivity.loginType);
				break;
			default:
				break;
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login);
		initViews();
		initData();
	}

	private void initData() {// 新浪微網誌執行個體

		mWeibo = Weibo.getInstance(ConstantS.APP_KEY, ConstantS.REDIRECT_URL,
				TAG);
	}

	private void initViews() {
		third_party_login_xinlang.setOnClickListener(this);

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.third_party_login_xinlang:
			isThreeLogin("1");
			isSinaLogin();
			break;
		}

	}
	/**
	 * 新浪登入
	 */
	private void isSinaLogin() {
		mSsoHandler = new SsoHandler(this, mWeibo);
		mSsoHandler.authorize(new AuthDialogListener(), null);
	}
	/**
	 * 新浪回調
	 * 
	 * @author Administrator
	 * 
	 */
	private class AuthDialogListener implements WeiboAuthListener {

		@Override
		public void onCancel() {

		}

		@Override
		public void onComplete(Bundle values) {
			String token = values.getString("access_token");
			String expires_in = values.getString("expires_in");
			final String idstr = values.getString("uid");
			LoginActivity.accessToken = new Oauth2AccessToken(token, expires_in);
			if (LoginActivity.accessToken.isSessionValid()) {
				String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
						.format(new java.util.Date(accessToken.getExpiresTime()));
				AccessTokenKeeper.keepAccessToken(LoginActivity.this,
						accessToken);
			}
			new Thread(new Runnable() {
				@Override
				public void run() {
					UserApi userApi = new UserApi(accessToken);
					userApi.show(idstr, new SinaRequestListener());
				}
			}).start();
		}

		@Override
		public void onError(WeiboDialogError arg0) {

		}

		@Override
		public void onWeiboException(WeiboException arg0) {

		}

	}

	/**
	 * 新浪請求接口
	 * 
	 * @author Administrator
	 * 
	 */
	private class SinaRequestListener implements RequestListener {

		@Override
		public void onComplete(String response) {
			JsonUtil jsonUtil = new JsonUtil();
			JSONObject jsonObject = jsonUtil.getJsonObject(response);
			try {
				Message msg = Message.obtain();
				String idstr = jsonObject.getString("idstr");// 唯一辨別符(uid)
				String name = jsonObject.getString("name");// 姓名
				String avatar_hd = jsonObject.getString("avatar_hd");// 頭像

				userModel.setUid(idstr);
				userModel.setNickname(name);
				userModel.setAvatar(avatar_hd);
				
				msg.what = END_SINA;
				handler.sendMessage(msg);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		@Override
		public void onComplete4binary(ByteArrayOutputStream arg0) {

		}

		@Override
		public void onError(WeiboException arg0) {

		}

		@Override
		public void onIOException(IOException arg0) {

		}

	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		if (mSsoHandler != null) {
			mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
		}
	}

}
           

好了,到此,已完結!如果認為好的話,想要轉載,請注明出處,謝謝!