转于: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
  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
  1. <activity
  2. android:name="com.tencent.tauth.AuthActivity"
  3. android:noHistory="true"
  4. android:launchMode="singleTask">
  5. <intent-filter>
  6. <actionandroid:name="android.intent.action.VIEW"/>
  7. <categoryandroid:name="android.intent.category.DEFAULT"/>
  8. <categoryandroid:name="android.intent.category.BROWSABLE"/>
  9. <!--下面这个XXXXXXXXXXXX就是你申请腾讯开发平台所给的appkey-->
  10. <dataandroid:scheme="tencentXXXXXXXXXXXX"/>
  11. </intent-filter>
  12. </activity>
  13. <activityandroid: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
  1. privatevoidloginByQQ(){
  2. //Constant.QQ_KEY这里是申请openqq给的appkey
  3. mTencent=Tencent.createInstance(Constant.QQ_KEY,LoginActivity.this);
  4. if(!mTencent.isSessionValid()){
  5. IUiListenerlistener=newBaseUiListener(){
  6. @Override
  7. protectedvoiddoComplete(JSONObjectvalues){
  8. //Log.e("qq",values.toString());
  9. try{
  10. //在这里我们可以去到唯一QQ互联可以给我们识别不同QQ用户的openid
  11. qqOpenId=values.getString("openid");
  12. }catch(JSONExceptione){
  13. //TODOAuto-generatedcatchblock
  14. e.printStackTrace();
  15. }finally{
  16. if(qqOpenId==null){
  17. qqOpenId="";
  18. }
  19. }
  20. ToastUtil.showToast(LoginActivity.this,"loginsuccess");
  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
  1. privatevoidupdateUserInfo(){
  2. if(mTencent!=null&&mTencent.isSessionValid()){
  3. IUiListenerlistener=newIUiListener(){
  4. @Override
  5. publicvoidonError(UiErrore){
  6. //获取不到这个信息
  7. }
  8. @Override
  9. publicvoidonComplete(finalObjectresponse){
  10. JSONObjectjson=(JSONObject)response;
  11. //Log.e("qquserinfo",json.toString());可以在这里打印来看看获取到了用户的什么信息,如果你想获取QQ号,那是不可能的//因为openqq没有提供这样的接口。
  12. StringnickName=getString(R.string.qq_user);//比如QQ昵称
  13. try{
  14. nickName=json.getString("nickname");
  15. }catch(JSONExceptione){
  16. e.printStackTrace();
  17. }
  18. }
  19. @Override
  20. publicvoidonCancel(){
  21. //获取用户信息被取消
  22. }
  23. };
  24. UserInfomInfo=newUserInfo(this,mTencent.getQQToken());
  25. mInfo.getUserInfo(listener);
  26. }else{
  27. }
  28. }

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

[java] view plain copy
  1. privateclassBaseUiListenerimplementsIUiListener{
  2. @Override
  3. publicvoidonComplete(Objectresponse){
  4. //V2.0版本,参数类型由JSONObject改成了Object,具体类型参考api文档
  5. doComplete((JSONObject)response);
  6. }
  7. protectedvoiddoComplete(JSONObjectvalues){
  8. //在这里可以做一些登录成功的处理
  9. ToastUtil.showToast(LoginActivity.this,getString(R.string.login_success));
  10. }
  11. @Override
  12. publicvoidonError(UiErrore){
  13. //在这里可以做登录失败的处理
  14. ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_fail));
  15. }
  16. @Override
  17. publicvoidonCancel(){
  18. //在这里可以做登录被取消的处理
  19. ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_cancel));
  20. }
  21. }

分享到QQ空间

方式一:

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

1.分享方法:

[java] view plain copy
  1. privatevoidshareToQQzone(){
  2. mQzoneShare=newQzoneShare(this,LoginActivity.mTencent.getQQToken());
  3. finalBundleparams=newBundle();
  4. //设置分享类型:图文并茂加链接。其他类型见帮助文档
  5. intshareType=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(inti=0;i<mImageContainerLayout.getChildCount();i++){
  19. //LinearLayoutaddItem=(LinearLayout)mImageContainerLayout.getChildAt(i);
  20. //EditTexteditText=(EditText)addItem.getChildAt(1);
  21. //imageUrls.add(editText.getText().toString());
  22. //}
  23. //StringimageUrl="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
  1. privatevoiddoShareToQzone(finalBundleparams){
  2. //finalActivityactivity=ProductDetailActivity.this;
  3. newThread(newRunnable(){
  4. @Override
  5. publicvoidrun(){
  6. Log.e("share","qzone");
  7. //TODOAuto-generatedmethodstub
  8. mQzoneShare.shareToQzone(ProductDetailActivity.this,params,newIUiListener(){
  9. @Override
  10. publicvoidonCancel(){
  11. //取消分享
  12. Log.e("qzoneshare","cancel");
  13. }
  14. @Override
  15. publicvoidonError(UiErrore){
  16. //分享错误
  17. Log.e("qzoneshare","error:"+e.errorDetail);
  18. }
  19. @Override
  20. publicvoidonComplete(Objectresponse){
  21. //分享成功
  22. Log.e("qzoneshare","success");
  23. }
  24. });
  25. }
  26. }).start();
  27. }

方式二:

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

1. 分享到QQ空间

[java] view plain copy
  1. privatevoidshareToQQzone(){
  2. finalBundleparams=newBundle();
  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,"contentinfro");
  6. params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL,"http://www.hicsg.com");
  7. ArrayList<String>imageUrls=newArrayList<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. TencentmTencent=Tencent.createInstance(Constant.QQ_KEY,ProductDetailActivity.this);
  12. mTencent.shareToQzone(ProductDetailActivity.this,params,newBaseUiListener());
  13. }

2. 回调

[java] view plain copy
  1. privateclassBaseUiListenerimplementsIUiListener{
  2. @Override
  3. publicvoidonComplete(Objectresponse){
  4. //V2.0版本,参数类型由JSONObject改成了Object,具体类型参考api文档
  5. doComplete((JSONObject)response);
  6. }
  7. protectedvoiddoComplete(JSONObjectvalues){
  8. //分享成功
  9. }
  10. @Override
  11. publicvoidonError(UiErrore){
  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. @Override
  21. publicvoidonCancel(){
  22. //分享被取消
  23. ToastUtil.showToast(ProductDetailActivity.this,getString(R.string.share_cancel));
  24. }
  25. }


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

更多相关文章

  1. Android(安卓)权限中文说明
  2. Android(安卓)中的 requestWindowFeature 收藏
  3. Android(安卓)G711A 音频编解码,去除“吱吱”电流声,附上so下载地
  4. Android(安卓)使用RecyclerView的方法
  5. android,自定义dialog
  6. android 监听应用前后台运行状态
  7. android 主activity 设置
  8. android OnPageChangeListener
  9. Android(安卓)权限集合

随机推荐

  1. android monkey app乱点测试
  2. 右侧滑出式提示框改良
  3. Android(安卓)存储:SD卡剩余空间的检测
  4. Android(安卓)XML文件中引用资源的方法
  5. Android:MediaRecoder——录制音视频
  6. 编译FFmpeg4.1.3并移植到Android(安卓)ap
  7. 【分享】Android二次打包植入广告
  8. Android(安卓)数据绑定 (Data Binding)
  9. Android多点触控实现图片自由缩放
  10. 从Xamarin.Essentials谈Xamarin库的封装