Android應用之最新版本SDKV2.4實現QQ第三方登入

yangxi_001發表於2015-01-12

為什麼要寫這篇部落格呢?因為,我在做這個第三方登入的時候,找了很多資料,發現要麼就是過時了,要麼就是說的很不清楚,很羅嗦,而且很多都是一些小demo,不是什麼例項,甚至連騰訊官方的文件都有這個問題,文件中很多地方用的不是最新的sdk寫的示例,用最新版本的sdk發現根本沒法達到預期的效果,很多api已經發生了變化,demo還是用的原來的api中的方法,最坑爹是demo下載下來還要一個支援的庫檔案,但是sdk中又沒有提供。。

\

自己跌跌撞撞,查詢資料,整合,弄了幾個小時,終於把它給整出來了,用在了開發的專案上面,達到了預期的效果,請看效果圖:

\ \ \

下面來說下怎麼實現的,儘量貼上全部程式碼,並解釋清楚

點選登入介面的QQ圖示,觸發呼叫第三方的事件

程式碼如下:

 

01.findViewById(R.id.iv_tencent_login).setOnClickListener(new OnClickListener() {
02. 
03.@Override
04.public void onClick(View v) {
05.// TODO Auto-generated method stub
06.mTencent = Tencent.createInstance(
07.AppConst.TENCENT_APP_ID,getApplicationContext());
08.        mTencent.login(E_SigninActivity.this,AppConst.TENCENT_SCOPE, newBaseUiListener());
09.}
10.});

其中 onclick中的幾句程式碼就是呼叫QQ登入的過程

 

 

1.Tencent.createInstance(AppConst.TENCENT_APP_ID,getApplicationContext());
這句程式碼得到Tencent例項,我們就是利用這個例項的login方法來 觸發QQ登入的。

 

上面的creatInstance方法有兩個引數,第一個引數就是你的APP_ID 這個是要在騰訊開放平臺申請的,具體怎麼申請可以參考開放平臺的介紹。

第二個引數是一個全域性的context上下文

下面來看第二句程式碼

 

1.mTencent.login(E_SigninActivity.this,AppConst.TENCENT_SCOPE, new BaseUiListener());
通過這句程式碼,SDK實現了QQ的登入,這個方法有三個引數,第一個引數是context上下文,第二個引數SCOPO 是一個String型別的字串,表示一些許可權

 

官方文件中的說明:應用需要獲得哪些API的許可權,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有許可權用“all”

第三個引數,是一個事件監聽器,IUiListener介面的例項,這裡用的是該介面的實現類

\

呼叫login方法後,就會監聽登入事件,登入成功或者失敗後,會回撥監聽器裡面的幾個方法,具體請看下面

 

01.private class BaseUiListener implements IUiListener {
02.private String nickname;
03.@Override
04.public void onComplete(Object response) {
05.Toast.makeText(getApplicationContext(), "回撥成功"0).show();
06.JSONObject responseJsonobject = (JSONObject) response;
07.final String openid = responseJsonobject.optString("openid");
08.final String access_token = responseJsonobject.optString("access_token");
09.final String expires_in = responseJsonobject.optString("expires_in");
10. 
11.Log.i(TAG, response.toString());
12.qqToken = mTencent.getQToken();
13.UserInfo info = new UserInfo(getApplicationContext(), qqToken);
14.info.getUserInfo(new IUiListener() {
15.@Override
16.public void onError(UiError arg0) {
17.// TODO Auto-generated method stub
18.}
19. 
20.@Override
21.public void onComplete(Object response) {
22.// TODO Auto-generated method stub
23.JSONObject jsonObject = (JSONObject) response;
24.nickname = jsonObject.optString("nickname");
25./** QQ登入成功後,獲取相關資訊,登入應用*/
26.loginModel.loginFromWeiboAndQQ(openid, access_token,
27.expires_in, nickname, BeeFrameworkApp.getInstance().getImei(),
28.SharedPrefsUtil.getString(E_SigninActivity.this,
29.AppConst.LATITUDE), SharedPrefsUtil.getString(
30.E_SigninActivity.this, AppConst.LONGITUDE));
31.}
32. 
33.@Override
34.public void onCancel() {
35.// TODO Auto-generated method stub
36.}
37.});
38.}
39. 
40.@Override
41.public void onError(UiError e) {
42.}
43. 
44.@Override
45.public void onCancel() {
46.}
47.}

當自定義的監聽器實現IUiListener介面後,必須要實現介面的三個方法,onComplete onCancel onError

 

分別表示第三方登入成功,取消 ,錯誤。

我們在QQ登入成功後要進行的後續操作就是寫在onComplete方法裡面的,在這裡進行開發即可。

onComplete的引數response封裝了一些關鍵的資訊,具體資訊如下圖所示:

\

一般情況下,QQ登入成功了,我們還想獲取一些QQ的基本資訊,比如暱稱,頭像什麼的,這個時候怎麼辦?

sdk給我們提供了一個類UserInfo,這個類中封裝了QQ使用者的一些資訊,我麼可以通過這個類拿到這些資訊

如何得到這個UserInfo類呢?

 

1.QQToken qqToken = mTencent.getQQToken();
2.UserInfo info = new UserInfo(getApplicationContext(), qqToken);

 

得到了userInfo物件後,呼叫它的getUserInfo(iuilistener)方法就可以得到使用者的基本資訊

 

01.info.getUserInfo(new IUiListener() {
02.@Override
03.public void onError(UiError arg0) {
04.// TODO Auto-generated method stub
05.}
06. 
07.@Override
08.public void onComplete(Object response) {
09.// TODO Auto-generated method stub
10. 
11.Log.i(TAG, response.toString());
12. 
13.JSONObject jsonObject = (JSONObject) response;
14.nickname = jsonObject.optString("nickname");
15./** QQ登入成功後,獲取相關資訊,登入應用*/
16.loginModel.loginFromWeiboAndQQ("qq", openid, access_token,
17.expires_in, nickname, BeeFrameworkApp.getInstance().getImei(),
18.SharedPrefsUtil.getString(E_SigninActivity.this,
19.AppConst.LATITUDE), SharedPrefsUtil.getString(
20.E_SigninActivity.this, AppConst.LONGITUDE));
21.}
22. 
23.@Override
24.public void onCancel() {
25.// TODO Auto-generated method stub
26.}
27.});

獲取使用者資訊成功後,同樣會呼叫onComplete方法,它的第一個引數response就封裝了使用者的資訊,它其實是一個json格式的字串,在之前的版本中是json格式的,新版本改為了Object。但是我們還是可以把它強轉成JSONObject 然後取其中的欄位,從下圖可以看出它裡面的所有資訊。

 

\

我們暫時只需要nickname暱稱,所以通過optstring得到nickname

 

1.JSONObject jsonObject = (JSONObject) response;
2.nickname = jsonObject.optString("nickname");

得到我們想要的全部資訊後,就可以在oncomplete中進行其他一些登入的操作了

 

QQ第三方登入的過程基本就是這個樣子了,當然API裡面還有很多其他的方法,response裡面還有很多其他資訊,大家也可以去挖掘,找到自己想要的,為我所用。

本篇部落格到這裡就結束了,希望能幫到你。

相關文章