本文基于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包,但这里我们只需要用到 open_sdk_***.jar.我们把这个包复制到我们项目中的libs中,然后配置要引用路径java path。

4.在Manifest中申明权限:

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

5.在Manifest中添加这些Activity

<activityandroid: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 keymTencent =Tencent.createInstance(Constant.QQ_KEY, LoginActivity.this);if (!mTencent.isSessionValid()) {IUiListener listener = newBaseUiListener() {@Overrideprotected voiddoComplete(JSONObject values) {//Log.e("qq",values.toString());try {//在这里我们可以去到唯一QQ互联可以给我们识别不同QQ用户的openidqqOpenId= values.getString("openid");} catch(JSONException e) {//TODO Auto-generated catch blocke.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() {@Overridepublic voidonError(UiError e) {//获取不到这个信息}@Overridepublic 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();}}@Overridepublic voidonCancel() {//获取用户信息被取消}};UserInfo mInfo = newUserInfo(this, mTencent.getQQToken());mInfo.getUserInfo(listener);} else {}
}

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

private classBaseUiListener implements IUiListener {@Overridepublic void onComplete(Objectresponse) {//V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档doComplete((JSONObject)response);}protected void doComplete(JSONObjectvalues) {//在这里可以做一些登录成功的处理ToastUtil.showToast(LoginActivity.this,getString(R.string.login_success));}@Overridepublic void onError(UiError e) {//在这里可以做登录失败的处理ToastUtil.showToast(LoginActivity.this,getString(R.string.qq_login_fail));}@Overridepublic 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() {@Overridepublic void run() {Log.e("share","qzone");// TODO Auto-generated methodstubmQzoneShare.shareToQzone(ProductDetailActivity.this,params, new IUiListener() {@Overridepublic void onCancel() {//取消分享Log.e("qzone share", "cancel");}@Overridepublic void onError(UiErrore) {//分享错误Log.e("qzone share", "error: "+e.errorDetail);}@Overridepublicvoid 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 {@Overridepublic void onComplete(Objectresponse) {//V2.0版本,参数类型由JSONObject 改成了Object,具体类型参考api文档doComplete((JSONObject)response);}protected void doComplete(JSONObjectvalues) {//分享成功}@Overridepublic 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);}}@Overridepublic 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为好友才可以进行测试。

Android中集成QQ登陆和QQ空间分享相关推荐

  1. Android中集成Jpush实现推送消息通知与根据别名指定推送附示例代码下载

    场景 经常会有后台服务向Android推送消息通知的情况. 实现 首先在Android Studio中新建一个Android应用 在Project根目录的build.gradle中配置了jcenter ...

  2. Android中集成第三方库的方法和问题

    Android中集成第三方库的方法和问题 声明: 1. 本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部 ...

  3. Android中集成高德地图SDK实现地图定位和导航功能(二)

    我们接着上一篇文章开始继续实现android中集成高德地图的SDK实现地图 定位,搜索,导航的功能 如何让地图在手机上实现呢? 1.配置AndroidManifest 中的权限申请 可以参考官方文档 ...

  4. Android中集成高德地图SDK实现地图定位和导航功能(一)

    一.前期准备工作 1.在高德地图开发者平创建一个自己的项目 名称和应用类型随便填 2.添加Key 1.添加key 2.获取SHA1值 2.1.使用windwos+R 输入cmd 打开控制窗口 输入 w ...

  5. android qq空间 sdk,Android中使用腾讯的SDK完成分享图文到qq空间

    1.首先在腾讯开放平台中注册APP_ID,下载SDK并导入到应用程序 2.开始分享图文到qq空间 /** * 分享歌曲到qzone */ private void share2qzone() { fi ...

  6. android如何实现qq登陆和qq分享,2021超详细mob平台图解教程?

    android如何使用mob平台实现QQ登录以及分享功能 1.在mob平台配置ShareSDK环境 1.如何在mob平台创建应用 2.获取你的`App Key`和`App Secret`(建议用自己的 ...

  7. Android中集成支付宝

    手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...

  8. 实现QQ登陆(QQ互联)

    更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战(干货) 构建中小型互联网企业架构(干货) ...

  9. java 分享到qq空间_Android中集成QQ登陆和QQ好友分享及QQ空间分享

    extends : http://blog.csdn.net/arjinmc/article/details/38439957 相关官方文档及下载地址: 如果只用分享和登陆,用lite包就可以,体积小 ...

最新文章

  1. 《CLR Via C# 第3版》笔记之(十) - 可选参数和可变数量参数
  2. 火狐浏览器 xml 解析错误:文档元素后存有无效内容_五分钟了解浏览器工作原理...
  3. JavaScript进阶部分笔记
  4. NBA Top Shot过去24小时二级市场交易额突破630万美元
  5. Oracle、MySql、SQLServer 数据库分页查询语句
  6. Matlab 遗传算法gaot、gatbx工具箱安装(出现未找到 ‘initializega‘、‘crtbp‘等错误)
  7. day13、1 - 抓包--科来软件使用
  8. 大数据分析师需要掌握哪些技能
  9. 【vulnhub】---DC-6靶机
  10. STM32单片机的学习方法(方法大体适用所有开发版入门)
  11. 从2T-12.8T 一颗芯片全搞定
  12. 调用阿里云web API实现滑块验证码
  13. 【Python处理EXCEL】--pandas导入Excel文件
  14. 连载《国培计划》骨干教师的研修日志之七:N个老师的日志
  15. 无盘服务器网线接法,无盘经验:解析网吧千兆网线的标准做法
  16. 自动解魔方机器人1 [算法篇]
  17. VC++ 编写程序计算月亮方位,高度,赤经,赤纬等信息
  18. photoclip / 移动端图片上传剪裁插件 /一款手势驱动的裁图插件
  19. 六、RTMP协议 时间戳
  20. Fedora 阿里云源

热门文章

  1. 迈德威视工业相机python二次开发,修改相机参数
  2. GitHub之深入解析如何创建、维护和管理自己的项目
  3. python和labview的区别_测量仪器科普:LabVIEW与虚拟仪器那点事
  4. 某商超小程序加密算法解析
  5. MS Office 2007 Project 安装方法
  6. Project Server 2003和Project Server 2007部署
  7. mysql撤销usage_MySQL撤销权限(Revote语句)
  8. 管理信息系统案例分析_「案例」MES系统助力华联电子仓库工作人员效率提高30%...
  9. 3ds Max随堂笔记 可编辑多边形(高级建模)
  10. KMP-看毛片算法 c++