Android中集成QQ登陆和QQ空间分享

转于:http://blog.csdn.net/arjinmc/article/details/38439957

--------------------------------------------------------------------------------

本文基于QQ open sdk V2.4.1。

 

QQ登录应用有一个地方是需要注意的, QQ申请同一品牌应用(包括网站和app),需要相互依赖申请,因为在QQ互联中,一个应用对应一个app key,如果网站和app的app key是不同的,这样相同用户使用QQ登录时候所产生的openid就会不同了,此时无法判断是否为同一个用户。在QQ互联中,一个用户的openid是对应一个应用,也就是说,如果这个用户去登录别的应用,QQ互联返回的openid是不同的。

 

准备工作:

1.注册腾讯开发者账号,上http://open.qq.com注册,填写好详细信息认证开发者信息,大概等1个工作日就可以审核完毕。

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中申明权限:

 

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.INTERNET" />  
  2. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />  

 

5.在Manifest中添加这些Activity

 

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. <activity  
  2.            android:name="com.tencent.tauth.AuthActivity"  
  3.             android:noHistory="true"  
  4.             android:launchMode="singleTask">  
  5.          <intent-filter>  
  6.                       <action android:name="android.intent.action.VIEW" />  
  7.                    <category android:name="android.intent.category.DEFAULT" />  
  8.                    <category android:name="android.intent.category.BROWSABLE" />  
  9.                             <!--下面这个XXXXXXXXXXXX就是你申请腾讯开发平台所给的app key-->  
  10.                       <data android:scheme="tencentXXXXXXXXXXXX" />  
  11.          </intent-filter>  
  12.  </activity>  
  13.  <activity android:name="com.tencent.connect.common.AssistActivity"  
  14.     android:theme="@android:style/Theme.Translucent.NoTitleBar"  
  15.     android:configChanges="orientation|keyboardHidden"/>  

 

QQ登录

1. 我们需要一个全局变量public static Tencent mTencent,当然你也可以声明为私有的非静态类型,这个是open qq给的例子中是这么写,为什么要这么用,后面会解释。

2.使用QQ登录:

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. private void loginByQQ(){  
  2.            // Constant.QQ_KEY 这里是申请open qq给的app key  
  3.            mTencent =Tencent.createInstance(Constant.QQ_KEY, LoginActivity.this);  
  4.            if (!mTencent.isSessionValid()) {  
  5.                     IUiListener listener = newBaseUiListener() {  
  6.                              @Override  
  7.                              protected voiddoComplete(JSONObject values) {  
  8.                                        //Log.e("qq",values.toString());  
  9.                                        try {  
  10.                                       //在这里我们可以去到唯一QQ互联可以给我们识别不同QQ用户的openid  
  11.                                                 qqOpenId= values.getString("openid");  
  12.                                        } catch(JSONException e) {  
  13.                                                 //TODO Auto-generated catch block  
  14.                                                 e.printStackTrace();  
  15.                                        }finally{  
  16.                                                 if(qqOpenId==null){  
  17.                                                          qqOpenId= "";  
  18.                                                 }  
  19.                                        }  
  20.                                        ToastUtil.showToast(LoginActivity.this,"login success");  
  21.                                        updateUserInfo();  
  22.                                  //Log.e("SDKQQAgentPref","AuthorSwitch_SDK:" + SystemClock.elapsedRealtime());  
  23.                              }  
  24.                     };  
  25.                    mTencent.login(this,"all", listener);  
  26.                     //Log.e("SDKQQAgentPref","FirstLaunch_SDK:" + SystemClock.elapsedRealtime());  
  27.            } else {  
  28.               mTencent.logout(this);  
  29.            }  
  30. }  

 

3. 获取QQ登录用户信息

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. privatevoid updateUserInfo() {  
  2.            if (mTencent != null &&mTencent.isSessionValid()) {  
  3.                     IUiListener listener = newIUiListener() {  
  4.                               
  5.                              @Override  
  6.                              public voidonError(UiError e) {  
  7.                                        //获取不到这个信息  
  8.                              }  
  9.                               
  10.                              @Override  
  11.                              public voidonComplete(final Object response) {  
  12.                                        JSONObjectjson = (JSONObject)response;  
  13.                                        //Log.e("qquser info", json.toString());可以在这里打印来看看获取到了用户的什么信息,如果你想获取QQ号,那是不可能的                                       //因为open qq没有提供这样的接口。  
  14.                                        StringnickName = getString(R.string.qq_user);//比如QQ昵称  
  15.                                        try {  
  16.                                                 nickName= json.getString("nickname");  
  17.                                       } catch (JSONException e) {  
  18.                                                 e.printStackTrace();  
  19.                                        }  
  20.                              }  
  21.                               
  22.                              @Override  
  23.                              public voidonCancel() {  
  24.                                        //获取用户信息被取消  
  25.                              }  
  26.                     };  
  27.                     UserInfo mInfo = newUserInfo(this, mTencent.getQQToken());  
  28.                     mInfo.getUserInfo(listener);  
  29.                      
  30.            } else {  
  31.            }  
  32. }  

 

4. 最重还需要一个回调类

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. private classBaseUiListener implements IUiListener {  
  2.            @Override  
  3.            public void onComplete(Objectresponse) {  
  4.                //V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档  
  5.                     doComplete((JSONObject)response);  
  6.            }  
  7.            protected void doComplete(JSONObjectvalues) {  
  8.                     //在这里可以做一些登录成功的处理  
  9.                     ToastUtil.showToast(LoginActivity.this,getString(R.string.login_success));  
  10.            }  
  11.            @Override  
  12.            public void onError(UiError e) {  
  13.                     //在这里可以做登录失败的处理  
  14.                     ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_fail));  
  15.            }  
  16.            @Override  
  17.            public void onCancel() {  
  18.                     //在这里可以做登录被取消的处理  
  19.                     ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_cancel));  
  20.            }  
  21.             
  22. }  

 

 

分享到QQ空间

方式一:

 在登录的时候,前面我们有用到public static Tencent mTencent,这个变量声明为静态变量,因为在demo例子中,这个mTencent对象在最底的Activty,所以它一直都没有被关闭,一直有效。因此,在这种情况下,我们可以直接用下面这个方法来做QQ分享。

1.分享方法:

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. privatevoid shareToQQzone(){  
  2.        mQzoneShare = new QzoneShare(this,LoginActivity.mTencent.getQQToken());  
  3.        final Bundle params = new Bundle();  
  4.        //设置分享类型:图文并茂加链接。其他类型见帮助文档  
  5.        int shareType = QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT;  
  6.        params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, shareType);  
  7.        //标题  
  8.        params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "测试");  
  9.        //内容  
  10.        params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, "contenttext");  
  11.        if (shareType !=QzoneShare.SHARE_TO_QZONE_TYPE_APP) {  
  12.             //app分享不支持传目标链接  
  13.            params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,"http://www.hicsg.com");  
  14.         }  
  15. //        // 支持传多个imageUrl,在这里我测试只放一张图片,最多可以放9张  
  16.         ArrayList<String> imageUrls = newArrayList<String>();  
  17.        imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");  
  18. //        for (int i = 0; i <mImageContainerLayout.getChildCount(); i++) {  
  19. //            LinearLayout addItem = (LinearLayout)mImageContainerLayout.getChildAt(i);  
  20. //            EditText editText = (EditText)addItem.getChildAt(1);  
  21. //           imageUrls.add(editText.getText().toString());  
  22. //        }  
  23.         // String imageUrl = "XXX";  
  24.         // params.putString(Tencent.SHARE_TO_QQ_IMAGE_URL,imageUrl);  
  25.        params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);  
  26.         doShareToQzone(params);  
  27.  }  

 

2. 回调方法:

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. privatevoid doShareToQzone(final Bundle params) {  
  2.         //final Activity activity =ProductDetailActivity.this;  
  3.         new Thread(new Runnable() {  
  4.              
  5.             @Override  
  6.             public void run() {  
  7.                Log.e("share","qzone");  
  8.                 // TODO Auto-generated methodstub  
  9.                mQzoneShare.shareToQzone(ProductDetailActivity.this,params, new IUiListener() {  
  10.    
  11.                     @Override  
  12.                     public void onCancel() {  
  13.                        //取消分享  
  14.                        Log.e("qzone share""cancel");  
  15.                     }  
  16.    
  17.                     @Override  
  18.                     public void onError(UiErrore) {  
  19.                        //分享错误  
  20.                        Log.e("qzone share""error: "+e.errorDetail);  
  21.                     }  
  22.    
  23.                      @Override  
  24.                     publicvoid onComplete(Object response) {  
  25.                         //分享成功  
  26.                          Log.e("qzoneshare""success");  
  27.                     }  
  28.    
  29.                 });  
  30.             }  
  31.         }).start();  
  32.     }  

 

方式二:

当然上面那种方式是比较不符合我们的使用习惯的,比如,我登录了一段时间,先把Activity关闭,我再打开app但是不登录,此时需要做分享处理,上面那个方法就会报空指针异常。此时,我们就需要用这个方法

1. 分享到QQ空间

  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. private void shareToQQzone() {  
  2.      final Bundle params = new Bundle();  
  3.      params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);  
  4.      params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "Test");  
  5.      params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY,  "content infro");  
  6.      params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,  "http://www.hicsg.com");  
  7.      ArrayList<String> imageUrls = new ArrayList<String>();  
  8.        imageUrls.add("http://media-cdn.tripadvisor.com/media/photo-s/01/3e/05/40/the-sandbar-that-links.jpg");  
  9.       params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);  
  10.      params.putInt(QzoneShare.SHARE_TO_QQ_EXT_INT,  QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);    
  11.      Tencent mTencent = Tencent.createInstance(Constant.QQ_KEY,ProductDetailActivity.this);  
  12.      mTencent.shareToQzone(ProductDetailActivity.this, params, newBaseUiListener());  
  13.   }  

 

2.  回调

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. privateclass BaseUiListener implements IUiListener {  
  2.             @Override  
  3.             public void onComplete(Objectresponse) {  
  4.                 //V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档  
  5.                 doComplete((JSONObject)response);  
  6.             }  
  7.             protected void doComplete(JSONObjectvalues) {  
  8.                 //分享成功  
  9.             }  
  10.             @Override  
  11.             public void onError(UiError e) {  
  12.                 //在这里处理错误信息  
  13.                 if(e.errorDetail == null){  
  14.                      ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.no_qq));  
  15.                 }else{  
  16.                      ToastUtil.showToast(ProductDetailActivity.this,  
  17.                             getString(R.string.share_fail)+":"+e.errorDetail);  
  18.                 }  
  19.                       
  20.             }  
  21.             @Override  
  22.             public void onCancel() {  
  23.                 //分享被取消  
  24.                 ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.share_cancel));  
  25.             }  
  26.    }  


更多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为好友才可以进行测试。

猜你喜欢

转载自yuemeiqing2008-163-com.iteye.com/blog/2177305