当前位置: 代码迷 >> Android >> Android中集成QQ登陆跟QQ空间分享
  详细解决方案

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

热度:145   发布时间:2016-04-28 02:42:18.0
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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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为好友才可以进行测试。

?

  相关解决方案