在新进的项目中,原先使用SharedSDK做第三方登录。在近期的数据统计分析中,发现会存在获取openid成功,而获取QQ用户信息不成功的情形。除却在获取信息失败情形下添加条件拦截外,使用QQ SDK直接实现第三方登录是另一个选择。

一、资源查看与下载

度娘还是很好用的啦,信息渠道的扩展,极大地缩小了信息搜索的难度,增加了信息获取的公平性。

这里是QQ官方文档,用于引导开发者使用并达到功能实现。

这篇博客描述也是相当详细!

二、功能实现

1,官方渠道注册

保存并获取APPID。

在新建项目中,导入下载的QQ 登录注册等相关jar包。

ps:QQ sdk 在3.2.1版本中添加基础包,有最基本的功能。【正在完善APP中只需要登录功能,遂换成基础包】

2,项目代码实现  -- 清单文件添加权限

   <!-- QQ登录授权所需权限 --><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

3,项目代码实现  -- 声明Activity

<!-- 注册SDKActivity --><activityandroid:name="com.tencent.tauth.AuthActivity"android:launchMode="singleTask"android:noHistory="true" ><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="tencentAppID" /> <!-- 开放平台获取的APPID --></intent-filter></activity><activity android:name="com.tencent.connect.common.AssistActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:screenOrientation="portrait"/>

ps:有些博客中没有声明AssistActivity,会导致创建Tencent对象为空的情形。

AppID为之前官方渠道注册所得,前面tencent字符串不可省不可改。

4,项目代码实现 ---  IUiListener接口实现

/*** qq登录监听器*/public class BaseUiListener implements IUiListener {protected void doComplete(Object values) {}@Overridepublic void onComplete(Object response) {doComplete(response);}@Overridepublic void onError(UiError e) {}@Overridepublic void onCancel() {}}

doComplete()方法在不同版本中传参可能不一样,并不影响使用。另一种传参为JsonObject。在实际的数据解析中,都会转换成为JSonObject从而获取需要的值。

5,项目代码实现 ---  创建Tencent实例

mTencent = Tencent.createInstance("AppID", this.getApplicationContext());

AppID为QQ官方注册所得,此处不添加其他任何字符串。
当清单文件没有 AssistActivity声明,会导致获取对象为空。

6,项目代码实现 ---  登录事件触发

在页面实现的QQ点击进行第三方登陆的onClick()事件下添加:

                if (!mTencent.isSessionValid()) {mTencent.login(this, "all", new BaseUiListener());}

7,项目代码实现 ---  回调监听

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (mTencent != null) {mTencent.handleLoginData(data, new BaseUiListener() {@Overrideprotected void doComplete(Object values) {String expires_in = "";try {qq_id = new JSONObject(values.toString()).getString("openid");qq_token = new JSONObject(values.toString()).getString("access_token");expires_in = new JSONObject(values.toString()).getString("expires_in");} catch (Exception e) {e.printStackTrace();}
//依据回调回来的值修改原有默认值mTencent.setOpenId(qq_id);mTencent.setAccessToken(qq_token, expires_in);QQToken qqToken = mTencent.getQQToken();UserInfo info = new UserInfo(LoginMainActivity.this, qqToken);           //获取用户基本信息info.getUserInfo(new BaseUiListener() {@Overrideprotected void doComplete(Object values) {try {JSONObject jsonObject = new JSONObject(values.toString());qq_name = jsonObject.getString("nickname");qq_icon = jsonObject.getString("figureurl_qq_2");/*** 增加QQ信息获取不完整拦截*/if (qq_name == null || qq_name.length() <= 0|| qq_icon == null || qq_icon.length() <= 0|| qq_id == null || qq_id.length() <= 0) {CustomProgressDialog.getInstance().dismiss();ToastView.showToast(LoginMainActivity.this, R.string.network_bad, ToastView.LENGTH_SHORT);//工具类,展示信息获取不完整return;}
//登录到客户端服务器} catch (JSONException e) {e.printStackTrace();}}});}});}}

注意:

(1)QQToken qqToken = mTencent.getQQToken();

获取前需要依据返回值设置数据,否则在之后的用户信息获取下会出现传参错误。

(2)用户信息获取的方法模式封装好

info.getUserInfo(new BaseUiListener() {});回调方法里面处理详细细节

(3)获取到用户信息,openid之后,需要与客户端本身的服务器关联,实现真正的登录。

三、细节注意

1,APPID的两处使用,清单文件中携带tencent的字符串,代码中获取Tencent对象不加任何其他字符;

2,获取用户信息前,需要重新设置Tencent对象的值;

3,mTencent.isSessionValid()是否使用:

(1)使用:需要在和APP登录成功后,注销掉QQ登录,使其失效。否则会出现APP退出再进行登录无效。

【原因:QQ已经是登陆状态,还没有失效,下次不会重新获取,触发登录流程】

mTencent.logout(this);

能够注销登录。

(2)不使用

每次点击事件都相当于触发登录事件,走登录流程。

客户端会有连续快速点击,需要做快速点击防止!

4,无QQ客户端添加拦截

在客户端处理没有QQ客户端拦截,不允许登录或者提示安装QQ客户端再登录。否则会有:WebAuthorizeActivity错误:

java.lang.NoSuchMethodError: cn.sharesdk.framework.authorize.e.disableScreenCaptureat cn.sharesdk.framework.authorize.e.onCreate(WebAuthorizeActivity.java:125)at com.mob.tools.MobUIShell.onCreate(MobUIShell.java:89)at android.app.Activity.performCreate(Activity.java:5350)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2430)at android.app.ActivityThread.access$800(ActivityThread.java:151)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)at android.os.Handler.dispatchMessage(Handler.java:110)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:5334)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:515)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)at dalvik.system.NativeStart.main(Native Method)

小小的自我提醒:

在追求任何知识和技能的过程中,最顶端的最后一小段路的边际成本是最高的,关山修阻,难以成行。但是边际理论只能带你到那里,最后一段路上请你务必忘记它。

QQ原生SDK第三方登录相关推荐

  1. 拾人牙慧篇之———QQ微信的第三方登录实现

    一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...

  2. Yii2 使用 QQ 和 Weibo 第三方登录源码

    我们社区在 yii2-authclient 多次升级后,登录异常.一直想寻求一种通用的方法,尽量不重写 OAuth2, BaseOAuth 以及 OAuthToken 类, 所以本次直接在 initU ...

  3. java 微信 qq 登录_拾人牙慧篇之———QQ微信的第三方登录实现

    一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...

  4. java qq微信微博第三方登录界面_android 实现第三方登录(微博、微信、QQ登录)

    [实例简介]此案例是演示案例,大家可以看到Bmob的第三方登录和信息获取如何工作的 实现了 qq.微信.微博的 第三方登录功能 [实例截图] [核心代码] package com.bmob.demo. ...

  5. Android 实现微信QQ分享以及第三方登录

    集成准备 在微信开放平台创建移动应用,输入应用的信息,包括移动应用名称,移动应用简介,移动应用图片信息,点击下一步,选择Android 应用,填写信息提交审核. 获取Appkey 集成[友盟+]SDK ...

  6. iOS:友盟SDK第三方登录 分享及友盟统计的使用

    本文转载至 http://www.it165.net/pro/html/201503/37101.html Tag标签:第三方   view sourceprint? 01.#import " ...

  7. QQ互联第三方登录多应用用户登录打通

    2019独角兽企业重金招聘Python工程师标准>>> 在开发第三方登录的时候,发现qq互联的第三方登录openId在多个应用中用户登录无法打通,然后发送邮件咨询了一下qq互联(邮箱 ...

  8. hbuilder怎么做登录界面_hbuilder 第三方登录实例

    hbuilder 第三方登录实例 微信.QQ第三方登录的具体实现 之前的文章已经说了相关manifest参数配置,在开发环境中相关sdk第三方登录那里的配置appid可以先随便写,因为hbuilder ...

  9. php实例-微信第三方登录

    下面小编就为大家带来一篇微信第三方登录(原生)demo[必看篇].小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在一家ecstore二开公司有一段时间了,公司希望往自己 ...

最新文章

  1. Unicode/not set/multi-byte/部分常用函数
  2. 动态链接到MFC的DLL(转)
  3. 量子计算机到底神在哪里说明文,“九章”量子计算机到底有多神!
  4. 多维列表索引_10分钟带你学会Pandas多层级索引
  5. Flask爱家租房--房屋管理(获取房东发布的房源信息条目)
  6. python循环体执行的次数与其他不同的是_【单选题】下面Python循环体执行的次数与其他不同的是( )...
  7. idea 注册码 实测可用
  8. Q73:蒙特•卡罗积分(Monte Carlo Integration)
  9. WSL自定义安装路径
  10. UILongPressGestureRecognizer
  11. raft算法_golang-raft算法理论与实践
  12. 灵格斯与word2007或2010冲突,复制时word关闭问题的解决
  13. 惠普803墨盒清零步骤_惠普2622墨盒清零步骤
  14. java垃圾回收的方法_java垃圾回收的方法都有哪些
  15. 阅读:IA-GCN: Interactive Graph Convolutional Network forRecommendation
  16. 简单的抢地盘js小游戏实战篇(多人在线对战)
  17. wordpress图像大小_如何在WordPress中添加图像积分(逐步操作)
  18. 计算机win7卡顿如何解决方法,电脑win7系统出现卡顿怎么处理
  19. tableau常规操作
  20. 系统服务(daemons)

热门文章

  1. 认识抖音聊天功能:让你更方便地社交交流
  2. (附源码)计算机毕业设计ssmSUNHome家政服务管理平台
  3. 安卓真机调试无授权信任窗口
  4. java扫描文件夹所有的文件_java 扫描文件夹所有下文件
  5. 线程池的5种使用方式
  6. notepadd++ 实用的快捷键
  7. Beam Management
  8. 云计算的核心技术及应用实例
  9. OpenRisc-14-or1200第一个裸机程序
  10. [黄玺庆]知易行难与知难行易