Android QQ 登录接入详细介绍

e58bd89dcb2c2481a75d8b77023eb35b.png

/   今日科技快讯   /

近日,百度地图发布2022春节出行大数据。迁徙大数据显示,2022年春运迁徙规模较去年农历同期有明显上升。春节期间全国人口迁徙规模日均值为去年农历同期的近两倍。春节前的迁徙规模峰值出现在1月29日(腊月廿七),春节后于2月6日达到峰值。

/   作者简介   /

本篇文章来自wresource的投稿,文章主要分享了他接入AndroidQQ登录的整个过程和心得,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。

wresource的博客地址:

https://dreamstudio.blog.csdn.net/

/   前言   /

由于之前自己项目的账号系统不是非常完善,所以考虑接入QQ这个强大的第三方平台的接入,目前项目暂时使用QQ登录的接口进行前期的测试,这次从搭建到完善花了整整两天时间,不得不吐槽一下QQ互联的官方文档,从界面就可以看出了,好几年没维修了,示例代码也写的不是很清楚,翻了好多源代码和官方的demo,这个demo可以作为辅助参考,官方文档的api失效了可以从里面找相应的替代,但它的代码也太多了,一个demo一万行代码,心累,当时把demo弄到可以运行就花了不少时间,很多api好像是失效了,笔者自己做了一些处理和完善,几乎把sdk功能列表的登录相关的api都尝试了一下,真的相当的坑,正文即将开始,希望这篇文章能够给后来者一些参考和帮助。

/   环境配置   /

获取应用ID

这个比较简单,直接到QQ互联官网申请一个即可,官网地址。

https://connect.qq.com

申请应用的时候需要注意应用名字不能出现违规词汇,否则可能申请不通过。

应用信息的填写需要当前应用的包名和签名,这个腾讯这边提供了一个获取包名和签名的app供我们开发者使用,下载地址。

https://pub.idqqimg.com/pc/misc/files/20180928/c982037b921543bb937c1cea6e88894f.apk

未通过审核只能使用调试的QQ号进行登录,通过就可以面向全部用户了,以下为审核通过的图片。

810ca3af334ceef400c6a93092b6d72b.png

官网下载相关的sdk

下载地址

https://tangram-1251316161.file.myqcloud.com/qqconnect/OpenSDK_V3.5.10/opensdk_3510_lite_2022-01-11.zip

推荐直接下载最新版本的,不过着实没看懂最新版本的更新公告,说是修复了retrofit冲突的问题,然后当时新建的项目没有用,结果报错,最后还是加上了,才可以。

ceefdd8ea16c8bd37a638a7d2265437f.png

jar的引入

将jar放入lib包下,然后在app同级的 build.gradle添加以下代码即完成jar的引用。

dependencies {...implementation fileTree(dir: 'libs', include: '*.jar')...}

配置Manifest

在AndroidManifest.xml中的application结点下增加以下的activity和启动QQ应用的声明,这两个activity无需我们在另外创建文件,引入的jar已经处理好了。

<application...    <!--这里的权限为开启网络访问权限和获取网络状态的权限,必须开启,不然无法登录--><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><activityandroid:name="com.tencent.tauth.AuthActivity"android:exported="true"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="tencent你的appId" /></intent-filter></activity><activityandroid:name="com.tencent.connect.common.AssistActivity"android:configChanges="orientation|keyboardHidden"android:screenOrientation="behind"android:theme="@android:style/Theme.Translucent.NoTitleBar" /><providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.tencent.login.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>...</application>

上面的哪个代码的最后提供了一个provider用于访问QQ应用的,需要另外创建一个xml文件,其中的authorities是自定义的名字,确保唯一即可,这边最下面那个provider是翻demo找的,文档没有写,在res文件夹中新增一个包xml,里面添加文件名为file_paths的 xml,其内容如下。

<?xml version="1.0" encoding="utf-8"?>
<paths><external-files-path name="opensdk_external" path="Images/tmp"/><root-path name="opensdk_root" path=""/>
</paths>

/   初始化配置   /

初始化SDK

加入以下代码在创建登录的那个activtiy下,不然无法拉起QQ应用的登录界面,至于官方文档所说的需要用户选择是否授权设备的信息的说明,这里通用的做法是在应用内部声明一个第三方sdk的列表,然后在里面说明SDK用到的相关设备信息的权限。

Tencent.setIsPermissionGranted(true, Build.MODEL)

创建实例

这部分建议放在全局配置,这样可以实现登录异常强制退出等功能。

/*** 其中APP_ID是申请到的ID* context为全局context* Authorities为之前provider里面配置的值*/val mTencent = Tencent.createInstance(APP_ID, context, Authorities)

开启登录

在开启登录之前需要自己创建一个 UIListener 用来监听回调结果(文档没讲怎么创建的,找了好久的demo)这里的代码为基础的代码,比较容易实现,目前还没写回调相关的代码,主要是为了快速展示效果。

open class BaseUiListener(private val mTencent: Tencent) : DefaultUiListener() {private val kv = MMKV.defaultMMKV()override fun onComplete(response: Any?) {if (response == null) {"返回为空,登录失败".showToast()return}val jsonResponse = response as JSONObjectif (jsonResponse.length() == 0) {"返回为空,登录失败".showToast()return}"登录成功".showToast()doComplete(response)}private fun doComplete(values: JSONObject?) {}override fun onError(e: UiError) {Log.e("fund", "onError: ${e.errorDetail}")}override fun onCancel() {"取消登录".showToast()}
}

建立一个按钮用于监听,这里进行登录操作。

button.setOnClickListener {if (!mTencent.isSessionValid) {//判断会话是否有效when (mTencent.login(this, "all",iu)) {//下面为login可能返回的值的情况0 -> "正常登录".showToast()1 -> "开始登录".showToast()-1 -> "异常".showToast()2 -> "使用H5登陆或显示下载页面".showToast()else -> "出错".showToast()}}}

这边对mTencent.login(this,“all”,iu)中login的参数做一下解释说明。

mTencent.login(this, "all",iu)
//这里Tencent的实例mTencent的login函数的三个参数
//1.为当前的context,
//2.权限,可选项,一般选择all即可,即全部的权限,不过目前好像也只有一个开放的权限了
//3.为UIlistener的实例对象

还差最后一步,获取回调的结果的代码,activity的回调,这边显示方法已经废弃了,本来想改造一下的,后面发现要改造的话需要动sdk里面的源码,有点麻烦就没有改了,等更新。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)//腾讯QQ回调,这里的iu仍然是相关的UIlistenerTencent.onActivityResultData(requestCode, resultCode, data,iu)if (requestCode == Constants.REQUEST_API) {if (resultCode == Constants.REQUEST_LOGIN) {Tencent.handleResultData(data, iu)}}
}

至此,已经可以正常登录了,但还有一件我们开发者最关心的事情没有做,获取的用户的数据在哪呢?可以获取QQ号吗?下面将为大家解答这方面的疑惑。

/   接入流程及相关代码   /

首先回答一下上面提出的问题,可以获得两段比较关键的json数据,一个是 login 的时候获取的,主要是token相关的数据,还有一段就是用户的个人信息的 json 数据,这些都在UIListener中进行处理和获取。第二个问题能不能获取QQ号,答案是不能,我们只能获取与一个与QQ号一样具有唯一标志的id即open_id,显然这是出于用户的隐私安全考虑的,接下来简述一下具体的登录流程。

登录之前检查是否有token缓存

  • 有,直接启动主activity

  • 无,进入登录界面

判断是否具有登录数据的缓存。

//这里采用微信的MMKV进行储存键值数据
MMKV.initialize(this)
val kv = MMKV.defaultMMKV()
kv.decodeString("qq_login")?.let{val gson = Gson()val qqLogin = gson.fromJson(it, QQLogin::class.java)QQLoginTestApplication.mTencent.setAccessToken(qqLogin.access_token,qqLogin.expires_in.toString())QQLoginTestApplication.mTencent.openId = qqLogin.openid
}

检查token和open_id是否有效和token是否过期,这里采取不同于官方的推荐的用法,主要是api失效了或者是自己没用对方法,总之官方提供的api进行缓存还不如MMKV键值存login json来的实在,也很方便,这里建议多多使用日志,方便排查错误。

//这里对于uiListener进行了重写,object的作用有点像java里面的匿名类
//用到了checkLogin的方法
mTencent.checkLogin(object : DefaultUiListener() {override fun onComplete(response: Any) {val jsonResp = response as JSONObjectif (jsonResp.optInt("ret", -1) == 0) {val jsonObject: String? = kv.decodeString("qq_login")if (jsonObject == null) {"登录失败".showToast()} else {//启动主activity}} else {"登录已过期,请重新登录".showToast()//启动登录activity}}override fun onError(e: UiError) {"登录已过期,请重新登录".showToast()//启动登录activity}override fun onCancel() {"取消登录".showToast()}
})

进入登录界面

在判断session有效的情况下,进入登录界面,对login登录可能出现的返回码做一下解释说明。

Login.setOnClickListener {if (!QQLoginTestApplication.mTencent.isSessionValid) {when (QQLoginTestApplication.mTencent.login(this, "all",iu)) {0 -> "正常登录".showToast()1 -> "开始登录".showToast()-1 -> {"异常".showToast()QQLoginTestApplication.mTencent.logout(QQLoginTestApplication.context)}2 -> "使用H5登陆或显示下载页面".showToast()else -> "出错".showToast()}}
}

1:正常登录

这个就无需做处理了,直接在回调那里做相关的登录处理即可。

0:开始登录

同正常登录。

-1:异常登录

这个需要做一点处理,当时第一次遇到这个情况就是主activity异常消耗退回登录的activity,此时在此点击登录界面的按钮导致了异常情况的出现,不过这个处理起来还是比较容易的,执行强制下线操作即可。

"异常".showToast()
mTencent.logout(QQLoginTestApplication.context)

2:使用H5登陆或显示下载页面

通常情况下是未安装QQ等软件导致的,这种情况无需处理,SDK自动封装好了,这种情况会自动跳转QQ下载界面。同样的有出现UIListener就需要调用回调进行数据的传输。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)//腾讯QQ回调Tencent.onActivityResultData(requestCode, resultCode, data,iu)if (requestCode == Constants.REQUEST_API) {if (resultCode == Constants.REQUEST_LOGIN) {Tencent.handleResultData(data, iu)}}
}

进入主activity

这里需要放置一个按钮执行下线操作,方便调试,同时这里需要将之前的token移除重新获取token等数据的缓存。

button.setOnClickListener {mTencent.logout(this)val  kv = MMKV.defaultMMKV()kv.remove("qq_login")//返回登录界面的相关操作"退出登录成功".showToast()
}

至此,其实还有一个很重要的东西没有说明,那就是token数据的缓存和个人信息数据的获取,这部分我写的登录的那个UIlistener里面了,登录成功的同时,获取login的response的json数据和个人信息的json数据。

获取两段重要的json数据

login的json数据

这个比较容易,当我们登录成功的时候,oncomplete里面的response即我们想要的数据。

override fun onComplete(response: Any?) {if (response == null) {"返回为空,登录失败".showToast()return}val jsonResponse = response as JSONObjectif (jsonResponse.length() == 0) {"返回为空,登录失败".showToast()return}//这个即利用MMKV进行缓存json数据kv.encode("qq_login",response.toString())"登录成功".showToast()}

个人信息的数据

这个需要在login有效的前提下才能返回正常的数据。

private fun doComplete(values: JSONObject?) {//利用Gson进行格式化成对象val gson = Gson()val qqLogin = gson.fromJson(values.toString(), QQLogin::class.java)mTencent.setAccessToken(qqLogin.access_token, qqLogin.expires_in.toString())mTencent.openId = qqLogin.openidLog.e("fund",values.toString())}

创建一个get_info方法进行获取,注意这里需要对mTencent设置相关的属性才能获取正常获取数据。

private fun getQQInfo(){val qqToken = mTencent.qqToken//这里的UserInfo是sdk自带的类,传入上下文和token即可val info = UserInfo(context,qqToken)info.getUserInfo(object :BaseUiListener(mTencent){override fun onComplete(response: Any?){//这里对数据进行缓存kv.encode("qq_info",response.toString())           }})
}

踩坑系列

这里主要吐槽一下关于腾讯的自带的session缓存机制,当时是抱着不用自己实现缓存直接用现成的机制去看的,很遗憾这波偷懒失败,这部分session的设置不知道具体的缓存机制,只知道大概是用share preference实现的,里面有saveSession,initSession,loadSession这三个方法,看上去很容易的样子,然后抱着这种心态去尝试了一波,果然不出意外空指针异常,尝试修改了一波回调的顺序仍然空指针异常,折腾了大概三个多小时,放弃了,心态给搞崩了,最终释然了,为什么要用腾讯提供的方法,这个缓存自己实现也是相当的容易,这时想到了MMKV,两行代码完成读取,最后只修改了少数的代码完成了登录的token的缓存机制,翻看demo里面的实现,里面好像是用这三种方法进行实现的,可能是某个实现机制没有弄明白,其实也不想明白,自己的思路比再去看demo容易多了,只是多了一个json的转对象的过程,其他的没有差别。所以建议后来者直接自己实现缓存,不用管sdk提供的那些方法,真的有点难用。

/   总结   /

总之这次完成QQ接入踩了许多的坑,不过幸好最终还是实现了,希望腾讯互联这个sdk能够上传github让更多的人参与和提供反馈,不然这个文档说是最差sdk体验也不为过。下面附上这次实现QQ登录的demo的github地址以及相关的demo apk供大家进行参考,大概总共就400行代码左右比官方的demo好很多,有问题欢迎留言。

GitHub地址:

https://github.com/xyh-fu/QQLoginTest

推荐阅读:

我的新书,《第一行代码 第3版》已出版!

Android Studio 新特性详解

LiveData为啥连续postValue两次,第一次的值会丢失?

欢迎关注我的公众号

学习技术或投稿

357db9718ac5f712199872fe6bc25b59.png

6bd103bb32e139a71650dca18d5706a6.png

长按上图,识别图中二维码即可关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23131.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工具使用-QQ/TIM(1)QQ/TIM客户端聊天窗口输入/自动变成表情 - 解决方案

问题&#xff1a; 我们在使用QQ/TIM客户端(电脑端)时&#xff0c;输入英文字符/时&#xff0c;会自动变成表情&#xff0c;且无法取消&#xff0c;无法避免。如下图所示&#xff1a; 解决&#xff1a; 打开QQ/TIM客户端&#xff0c;并打开一个聊天窗口。在聊天窗口中点击表情图…

chatgpt赋能python:Python软件图标的SEO

Python软件图标的SEO 介绍 Python是一种高级编程语言&#xff0c;具有易读性、可维护性和可扩展性等优点&#xff0c;因此在许多应用程序中广泛使用。Python软件的图标是这些应用程序中一个非常重要的视觉元素。图标的质量和吸引力可以决定用户下载和使用该应用程序的意愿。因…

漫谈高数

漫谈高数 (一) 泰勒级数的物理意义 高等数学干吗要研究级数问题? 是为了把简单的问题弄复杂来表明自己的高深? No&#xff0c;是为了把各种简单的问题/复杂的问题&#xff0c;他们的求解过程用一种通用的方法来表示。 提一个问题&#xff0c;99*99等于多少? 相信我们不会傻到…

《高等数学A》课堂笔记——高分必过

《高等数学》上下学期的课堂笔记 ——郑州大学 文章目录 一、函数与极限1.1 映射与函数1.2 数列的极限1.3 函数的极限1.4 无穷小与无穷大1.5 极限运算法则1.6 极限存在准则及两个重要极限1.7 无穷小的比较1.8 函数的连续性与间断性问题…

高等数学【合集2】

文章目录 积分计算递推重点补充 积分计算 求导 ⇄ 积分 求导 \rightleftarrows 积分 求导⇄积分 求导积分 ( t ) ′ 1 \large (t)1 (t)′1 ∫ t d t 1 2 t 2 c \large\int tdt\frac{1}{2}t^2c ∫tdt21​t2c ( 1 x ) ′ − 1 x 2 \large(\frac{1}{x})-\frac{1}{x^2} (x1​)…

高等数学【合集】

文章目录 极限计算求导计算积分计算 极限计算 第一步 : 先看 x → v a l u e 确定类型 第一步:先看x \rightarrow value确定类型 第一步:先看x→value确定类型 7 种未定型 : ∞ ∞ , 0 0 , 1 ∞ , 0 ∞ , ∞ 0 , 0 0 , ∞ − ∞ 7种未定型: \frac{\infty}{\infty},\frac{0}{0}…

一、浙江专升本高等数学考点-函数

1.连续函数的性质 考点分析 函数的连续性主要考察函数的奇偶性、有界性、单调性、周期性。 例题 判断函数的奇偶性 的有界区间为&#xff08;&#xff09; A.(-1,0) B(0,1) C(1,2) D(2,3) 2.闭区间上连续函数的性质 考点分析 闭区间上连续函数的性质主要考察函数的最大最小值…

超过ChatGPT3达到ChatGPT4%90性能的小羊驼来了-Vicuna(校招社招必备,chatgpt风口来了赶紧学起来吧)

达到GPT4百分之90性能的小羊驼Vicuna 文章目录 达到GPT4百分之90性能的小羊驼Vicuna一、小羊驼Vicuna介绍二、使用效果测评三、小羊驼Vicuna安装webui linux部署教程总结踩坑经验 随着chatgpt大火&#xff0c;很多人都开始学习chatgpt相关知识&#xff0c;本文就介绍一下最近很…

highcharts去水印方法

highcharts去水印方法 在和title同级的地方&#xff0c;输入 credits: { enabled:false, }, 即可去水印&#xff0c;亲测有效。 highcharts的商用版是需要收费的&#xff0c;在个人网站、学校网站及非盈利机构中使用 Highcharts 完全不需要经过许可&#xff0c;直接可以任意使…

分享一个去水印接口,完全免费,早点下手啊

上传到任意空间或者服务器&#xff0c;访问即可用。 目前支持很多平台&#xff1a;抖音|快手|皮皮虾|西瓜|红书|微视|最右|哔哩哔哩&#xff0c;皮皮搞笑等常见平台. 而且还是免费的。 该接口测试&#xff0c;完全免费&#xff0c;如果那天收费了&#xff0c;大家可以直接放弃…

如何批量去除图片水印?批量去水印方法

地址&#xff1a;如何批量去除图片水印https://www.shuiyinyun.com/inpaint-image.html步骤&#xff1a; 在平台当中可以直接把自己要去水印的图片依次添加进去&#xff0c;然后用工具选择去水印区域&#xff0c;可多选&#xff0c;图片全部都选择好后&#xff0c;点击批量处理…

如何去水印而不损图片?码住这三个方法学会图片怎么去水印

当我们在网上“冲浪”时&#xff0c;会看到一些喜欢的图片&#xff0c;想要保存当做壁纸或头像&#xff0c;但是保存下来后却发现带有水印&#xff0c;导致画面被遮挡&#xff0c;影响美观&#xff0c;放弃又舍不得&#xff0c;这个时候可以使用一些软件去除图片上的水印&#…

去图片水印软件有哪些?安利这几个实用的工具给你们

现在我们会从网上一些平台下载一些图片或视频来当做素材&#xff0c;不过有些图片和视频会带有水印。对于我们二次使用来说很不方便。如果想要保持图片的干净、完整&#xff0c;那就需要去除图片的水印。下面我就来教你们图片去水印的方法&#xff0c;你们感兴趣的话&#xff0…

不知道免费去水印图片软件哪个好?来看看这3个软件

我们在编辑项目汇报的演示文稿时&#xff0c;会在网上下载素材图片来充实我们的内容&#xff0c;但是有一些图片上会带有网站的水印&#xff0c;使得图片不太美观&#xff0c;将图片的水印去除会让图片的观感和效果更好。我们有给图片去水印的需求&#xff0c;市面上自然就有支…

正版软件|WonderFox Photo Watermark 图片水印批量处理软件

Photo Watermark 可以为您做什么&#xff1f;水印是最有效的方法&#xff0c;可防止他人擅自使用您的照片。只需单击几下&#xff0c;Watermark Software 将为您的图像文件提供不可磨灭的保护。 可自定义的水印 文本水印 只需按键即可创建支持丰富字体&#xff0c;符号&#…

Inpaint>>一款神奇的去水印工具

今天为大家介绍一款图片去水印利器&#xff1a;Inpaint Inpaint是一款去除图片背景中瑕疵的图片处理软件。有时候我们的照片上可能有一些瑕疵&#xff0c;我们想把它去掉&#xff0c;这时你不必动用庞大PS来兴师动众处理&#xff0c;只需要使用Inpaint就可以轻松搞定。它可以从…

如何除掉图片水印?分享操作便捷的几种去水印技巧

在如今的社交媒体时代&#xff0c;我们经常需要在网上寻找高质量的图片来配合我们的项目或者个人需求。然而&#xff0c;很多时候我们发现这些图片都有着令人厌烦的水印&#xff0c;这些水印不仅影响了图片的美观度&#xff0c;也限制了我们对图片的使用和分享。在这种情况下&a…

怎么样去图片水印?用这三招快速消除水印

有时我们会从网上下载图片&#xff0c;而这些图片往往都带有水印&#xff0c;不仅影响观看&#xff0c;而且也不太美观。那么图片去水印方法有哪些呢&#xff1f;下面我就跟大家分享几个不错的方法&#xff0c;一起来看看吧。 方法一&#xff1a;借助第三方工具来去除图片水印 …

分享图片去水印几个工具-图片去除水印最好用的工具

日常生活中&#xff0c;我们说的水印是指&#xff1a;是来着平台、作者出于强调平台出处、创作者目的&#xff0c;对图片、视频加的水印。不过&#xff0c;水印的存在会影响整体的观感。如果你想将这些素材用于个人收藏、二次创作&#xff0c;这就需要进行去水印的处理。 今天…

怎么去图片水印?三招让你快速学会图片去水印

上大学的时候&#xff0c;老师让我们每人写一个关于“阅读”的主题报告。写这个主题报告的时候&#xff0c;我发现在网上找的图片素材大多带有水印&#xff0c;十分影响报告的展示效果。于是&#xff0c;我就上网找了一些怎么去图片水印的方法&#xff0c;对这些方法进行试验后…