Android中集成QQ登錄和QQ好友分享及QQ空間分享

extends : http://blog.csdn.net/arjinmc/article/details/38439957html

 

相關官方文檔及下載地址:java

若是隻用分享和登錄,用lite包就能夠,體積小android

http://wiki.open.qq.com/wiki/mobile/API%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E#1.13_.E5.88.86.E4.BA.AB.E6.B6.88.E6.81.AF.E5.88.B0QQ.EF.BC.88.E6.97.A0.E9.9C.80QQ.E7.99.BB.E5.BD.95.EF.BC.89
http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD

 

 

本文基於QQ open sdk V2.4.1。json

 

QQ登陸應用有一個地方是須要注意的, QQ申請同一品牌應用(包括網站和app),須要相互依賴申請,由於在QQ互聯中,一個應用對應一個app key,若是網站和app的app key是不一樣的,這樣相同用戶使用QQ登陸時候所產生的openid就會不一樣了,此時沒法判斷是否爲同一個用戶。在QQ互聯中,一個用戶的openid是對應一個應用,也就是說,若是這個用戶去登陸別的應用,QQ互聯返回的openid是不一樣的。api

 

準備工做:app

1.註冊騰訊開發者帳號,上http://open.qq.com註冊,填寫好詳細信息認證開發者信息,大概等1個工做日就能夠審覈完畢。ide

2.審覈經過後能夠在「管理資料」中建立應用,在這裏咱們選擇的是移動應用。測試

3.下載open qq給的sdk包(http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD),解壓看到,doc是需集成移動數據分析纔會使用到,也是一個教程,在這裏不介紹了。jar就是open qq提供的jar包,但這裏咱們只須要用到mta-sdk-1.6.2.jar.咱們把這個包複製到咱們項目中的libs中,而後配置要引用路徑java path。網站

 

4.在Manifest中申明權限:this

 
<uses-permissionandroid:nameuses-permissionandroid:name="android.permission.INTERNET" />  
<uses-permissionandroid:nameuses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />  

 

 

 

5.在Manifest中添加這些Activity

  

 
<activity  
           android:name="com.tencent.tauth.AuthActivity"  
            android:noHistory="true"  
            android:launchMode="singleTask">  
         <intent-filter>  
                      <action android:name="android.intent.action.VIEW" />  
                   <category android:name="android.intent.category.DEFAULT" />  
                   <category android:name="android.intent.category.BROWSABLE" />  
                            <!--下面這個XXXXXXXXXXXX就是你申請騰訊開發平臺所給的app key-->  
                      <data android:scheme="tencentXXXXXXXXXXXX" />  
         </intent-filter>  
 </activity>  
 <activity android:name="com.tencent.connect.common.AssistActivity"  
    android:theme="@android:style/Theme.Translucent.NoTitleBar"  
    android:configChanges="orientation|keyboardHidden"/>  


 

 

QQ登陸

1. 咱們須要一個全局變量public static Tencent mTencent,固然你也能夠聲明爲私有的非靜態類型,這個是open qq給的例子中是這麼寫,爲何要這麼用,後面會解釋。

2.使用QQ登陸:

  

private void loginByQQ(){  
           // Constant.QQ_KEY 這裏是申請open qq給的app key  
           mTencent =Tencent.createInstance(Constant.QQ_KEY, LoginActivity.this);  
           if (!mTencent.isSessionValid()) {  
                    IUiListener listener = newBaseUiListener() {  
                             @Override  
                             protected voiddoComplete(JSONObject values) {  
                                       //Log.e("qq",values.toString());  
                                       try {  
                                      //在這裏咱們能夠去到惟一QQ互聯能夠給咱們識別不一樣QQ用戶的openid  
                                                qqOpenId= values.getString("openid");  
                                       } catch(JSONException e) {  
                                                //TODO Auto-generated catch block  
                                                e.printStackTrace();  
                                       }finally{  
                                                if(qqOpenId==null){  
                                                         qqOpenId= "";  
                                                }  
                                       }  
                                       ToastUtil.showToast(LoginActivity.this,"login success");  
                                       updateUserInfo();  
                                 //Log.e("SDKQQAgentPref","AuthorSwitch_SDK:" + SystemClock.elapsedRealtime());  
                             }  
                    };  
                   mTencent.login(this,"all", listener);  
                    //Log.e("SDKQQAgentPref","FirstLaunch_SDK:" + SystemClock.elapsedRealtime());  
           } else {  
              mTencent.logout(this);  
           }  
}  
 

 

3. 獲取QQ登陸用戶信息

  

 
privatevoid updateUserInfo() {  
           if (mTencent != null &&mTencent.isSessionValid()) {  
                    IUiListener listener = newIUiListener() {  
                              
                             @Override  
                             public voidonError(UiError e) {  
                                       //獲取不到這個信息  
                             }  
                              
                             @Override  
                             public voidonComplete(final Object response) {  
                                       JSONObjectjson = (JSONObject)response;  
                                       //Log.e("qquser info", json.toString());能夠在這裏打印來看看獲取到了用戶的什麼信息,若是你想獲取QQ號,那是不可能的                                       //由於open qq沒有提供這樣的接口。  
                                       StringnickName = getString(R.string.qq_user);//好比QQ暱稱  
                                       try {  
                                                nickName= json.getString("nickname");  
                                      } catch (JSONException e) {  
                                                e.printStackTrace();  
                                       }  
                             }  
                              
                             @Override  
                             public voidonCancel() {  
                                       //獲取用戶信息被取消  
                             }  
                    };  
                    UserInfo mInfo = newUserInfo(this, mTencent.getQQToken());  
                    mInfo.getUserInfo(listener);  
                     
           } else {  
           }  
}  
 

 

4. 最重還須要一個回調類

  

 
private classBaseUiListener implements IUiListener {  
           @Override  
           public void onComplete(Objectresponse) {  
               //V2.0版本,參數類型由JSONObject 改爲了Object,具體類型參考api文檔  
                    doComplete((JSONObject)response);  
           }  
           protected void doComplete(JSONObjectvalues) {  
                    //在這裏能夠作一些登陸成功的處理  
                    ToastUtil.showToast(LoginActivity.this,getString(R.string.login_success));  
           }  
           @Override  
           public void onError(UiError e) {  
                    //在這裏能夠作登陸失敗的處理  
                    ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_fail));  
           }  
           @Override  
           public void onCancel() {  
                    //在這裏能夠作登陸被取消的處理  
                    ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_cancel));  
           }  
            
}  

 

 

 

 

分享到QQ空間

方式一:

 在登陸的時候,前面咱們有用到public static Tencent mTencent,這個變量聲明爲靜態變量,由於在demo例子中,這個mTencent對象在最底的Activty,因此它一直都沒有被關閉,一直有效。所以,在這種狀況下,咱們能夠直接用下面這個方法來作QQ分享。

1.分享方法:

 

privatevoid shareToQQzone(){  
       mQzoneShare = new QzoneShare(this,LoginActivity.mTencent.getQQToken());  
       final Bundle params = new Bundle();  
       //設置分享類型:圖文並茂加連接。其餘類型見幫助文檔  
       int shareType = QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT;  
       params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, shareType);  
       //標題  
       params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "測試");  
       //內容  
       params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "contenttext");  
       if (shareType !=QzoneShare.SHARE_TO_QZONE_TYPE_APP) {  
            //app分享不支持傳目標連接  
           params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,"http://www.hicsg.com");  
        }  
//        // 支持傳多個imageUrl,在這裏我測試只放一張圖片,最多能夠放9張  
        ArrayList<String> imageUrls = newArrayList<String>();  
       imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");  
//        for (int i = 0; i <mImageContainerLayout.getChildCount(); i++) {  
//            LinearLayout addItem = (LinearLayout)mImageContainerLayout.getChildAt(i);  
//            EditText editText = (EditText)addItem.getChildAt(1);  
//           imageUrls.add(editText.getText().toString());  
//        }  
        // String imageUrl = "XXX";  
        // params.putString(Tencent.SHARE_TO_QQ_IMAGE_URL,imageUrl);  
       params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);  
        doShareToQzone(params);  
 }  
 

 

 
 

2. 回調方法:

 

privatevoid doShareToQzone(final Bundle params) {  
        //final Activity activity =ProductDetailActivity.this;  
        new Thread(new Runnable() {  
             
            @Override  
            public void run() {  
               Log.e("share","qzone");  
                // TODO Auto-generated methodstub  
               mQzoneShare.shareToQzone(ProductDetailActivity.this,params, new IUiListener() {  
   
                    @Override  
                    public void onCancel() {  
                       //取消分享  
                       Log.e("qzone share", "cancel");  
                    }  
   
                    @Override  
                    public void onError(UiErrore) {  
                       //分享錯誤  
                       Log.e("qzone share", "error: "+e.errorDetail);  
                    }  
   
                     @Override  
                    publicvoid onComplete(Object response) {  
                        //分享成功  
                         Log.e("qzoneshare", "success");  
                    }  
   
                });  
            }  
        }).start();  
    }  

 

 

方式二:

固然上面那種方式是比較不符合咱們的使用習慣的,好比,我登陸了一段時間,先把Activity關閉,我再打開app可是不登陸,此時須要作分享處理,上面那個方法就會報空指針異常。此時,咱們就須要用這個方法

1. 分享到QQ空間

  

private void shareToQQzone() {  
     final Bundle params = new Bundle();  
     params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);  
     params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "Test");  
     params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY,  "content infro");  
     params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,  "http://www.hicsg.com");  
     ArrayList<String> imageUrls = new ArrayList<String>();  
       imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");  
      params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);  
     params.putInt(QzoneShare.SHARE_TO_QQ_EXT_INT,  QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);    
     Tencent mTencent = Tencent.createInstance(Constant.QQ_KEY,ProductDetailActivity.this);  
     mTencent.shareToQzone(ProductDetailActivity.this, params, newBaseUiListener());  
  }  
 

 

2.  回調

privateclass BaseUiListener implements IUiListener {  
            @Override  
            public void onComplete(Objectresponse) {  
                //V2.0版本,參數類型由JSONObject 改爲了Object,具體類型參考api文檔  
                doComplete((JSONObject)response);  
            }  
            protected void doComplete(JSONObjectvalues) {  
                //分享成功  
            }  
            @Override  
            public void onError(UiError e) {  
                //在這裏處理錯誤信息  
                if(e.errorDetail == null){  
                     ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.no_qq));  
                }else{  
                     ToastUtil.showToast(ProductDetailActivity.this,  
                            getString(R.string.share_fail)+":"+e.errorDetail);  
                }  
                      
            }  
            @Override  
            public void onCancel() {  
                //分享被取消  
                ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.share_cancel));  
            }  
   }  

 

 

 


更多api幫助見api文檔:http://wiki.open.qq.com/wiki/Android_API%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E#1.14_.E5.88.86.E4.BA.AB.E5.88.B0QQ.E7.A9.BA.E9.97.B4.EF.BC.88.E6.97.A0.E9.9C.80QQ.E7.99.BB.E5.BD.95.EF.BC.89

 

別忘了要在代碼混淆中添加

-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}

 

P.S

測試的時候,須要開發者帳號QQ或者加這個QQ爲好友才能夠進行測試。

 

-------------------------------------------我的分享方法------------------------------------------

    public void shareToQQ() {
        final Bundle params = new Bundle();
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
        //分享的標題。注:PARAM_TITLE、PARAM_IMAGE_URL、PARAM_    SUMMARY不能全爲空,最少必須有一個是有值的。
        params.putString(QQShare.SHARE_TO_QQ_TITLE, shareTitle);
        params.putString(QQShare.SHARE_TO_QQ_SUMMARY, shareContent);
        //這條分享消息被好友點擊後的跳轉URL。
        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, shareUrlLink);
        //分享的圖片URL
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, shareImageLink);
        //手Q客戶端頂部,替換「返回」按鈕文字,若是爲空,用返回代替
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, mActivity.getString(R.string.app_name));
//        params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, "其餘附加功能");
        Tencent mTencent = Tencent.createInstance(AppConstants.KEY_QQ, mActivity);
        mTencent.shareToQQ(mActivity, params, new BaseUiListener());
    }
  private void shareToQQzone() {
        final Bundle params = new Bundle();
        params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
        params.putString(QzoneShare.SHARE_TO_QQ_TITLE, shareTitle);
        params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, shareContent);
        params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, shareUrlLink);
        ArrayList<String> imageUrls = new ArrayList<String>();
        imageUrls.add(shareImageLink);
        params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
        params.putInt(QzoneShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
        Tencent mTencent = Tencent.createInstance(AppConstants.KEY_QQ, mActivity);
        mTencent.shareToQzone(mActivity, params, new BaseUiListener());
    }
    private class BaseUiListener implements IUiListener {
        @Override
        public void onComplete(Object response) {
            //V2.0版本,參數類型由JSONObject 改爲了Object,具體類型參考api文檔
            doComplete((JSONObject) response);
        }

        protected void doComplete(JSONObject values) {
            //分享成功
//            AppUtils.showToast(mActivity, "分享成功");
        }

        @Override
        public void onError(UiError e) {
            //在這裏處理錯誤信息
            if (e.errorDetail == null) {
                Log.e("QQShareError", "unknown error");
            } else {
                Log.e("QQShareError", e.errorDetail);
            }
        }

        @Override
        public void onCancel() {
            //分享被取消
        }
    }
相關文章
相關標籤/搜索