(AS笔记)Android 实现第三方QQ登录——QQ互联
目录
- 1.获取应用AppId
- 2.获取并配置SDK开发包
- 3.AndroidManifest.xml引入SDK资源
- 4.代码引入
- 5.总结
1.获取应用AppId
(1)QQ互联官网申请:https://connect.qq.com/
说明:登录后,首先认证个人开发者,然后才有权限创建应用,申请填资料的时候,务必真实信息,不然审核打回来,得等很久才通过。
(2)登录个人开发者QQ:移动应用——开始创建
(3)进入控制台——应用管理——创建应用
(4)选择:创建移动应用
(5)根据自身情况:资料填写
(6)APP应用签名+logo
签名工具内容如下:
(7)创建成功,得到的APPID将在AndroidStudio中使用
2.获取并配置SDK开发包
(1)下载链接:https://wiki.connect.qq.com/sdk%e4%b8%8b%e8%bd%bd
(2)压缩包文件名:opensdk_355_lite_2021-07-30.zip,解压提取文件:
(3)找到,我们需要的jar包资源,粘贴拷贝一份在电脑桌面。
说明:官网文档没有明确说明jar包清单,其实需要3个jar包,而解压出的文件,只有一个jar包。因此其它的两个就得去示例项目的libs中手动拷贝,如下:
——copy核心库:open_sdk_3.5.5.79_ra741783e_lite.jar
——copy支持库:mid-sdk-2.10.jar、mta-sdk-2.0.0.jar
说明:open_sdk_lite.jar是旧版本SDK核心库
(4)从电脑桌面复制3个jar包AndroidStudio粘贴项目至项目工程libs目录,并添加依赖引入
——工程目录libs:
——加载jar包资源:app/build.gradle
implementation fileTree(dir: 'libs', include: '*.jar')
3.AndroidManifest.xml引入SDK资源
(1)添加Android API 31 系统版本 12 的权限查询,否则Android 12 系统跳转不到授权页,导致点击登录按钮,查询不到手机上已安装的腾讯QQ的APP,出现下载QQ页面,添加如下:
<queries><package android:name="com.tencent.mobileqq" /></queries>
(2)添加Android应用权限项
<!-- qq登陆所需 --><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.GET_TASKS"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
(3)注册SDK需要跳转的Activity,这是SDK封装好的,只需要注册在<application>标签中,就能调用SDK的功能了。
<!-- 第三方qq登录 --><activityandroid:name="com.tencent.connect.common.AssistActivity"android:configChanges="orientation|keyboardHidden"android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent.NoTitleBar" /><activityandroid:name="com.tencent.tauth.AuthActivity"android:launchMode="singleTask"android:noHistory="true"android:exported="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" /></intent-filter></activity>
说明: <data android:scheme="tencentAPPID" /> 需要替换APPID 为自己的创建应用申请通过的APPID,tencent不能删,例如:tencent123456
4.代码引入
布局就不说了,根据自己需求慢慢搞。
(1)首先创建获取Tencent实例
——添加全局变量:
//声明Tencent实例名称
public static Tencent mTencent;
——创建Tencent实例:
mTencent = Tencent.createInstance("APPID", LoginActivity.this);if (mTencent == null) {SLog.e(TAG, "腾讯实例创建失败");finish();}
(2)登录按钮添加单击监听事件,点击按钮调用自定义方法onClickLogin()
(3)onClickLogin()
private void onClickLogin() {mTencent.login(this, "all", loginListener);
}
(4)loginListener报错?,报错就对了,这是登录回调接口。那就写接口实现登录的login()方法。如下:
IUiListener loginListener = new BaseUiListener() {@Overrideprotected void doComplete(JSONObject values) {/** 此处回调QQ用户数据处理 */initOpenidAndToken(values); //初始化Token//updateUserInfo(); 更新用户信息,头像,用户名//updateLoginButton(); 登录按钮更新为已登录}};public static void initOpenidAndToken(JSONObject jsonObject) {try {String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)&& !TextUtils.isEmpty(openId)) {mTencent.setAccessToken(token, expires);mTencent.setOpenId(openId);}} catch (Exception e) {}}
(5)BaseUiListener报错?
private class BaseUiListener extends DefaultUiListener {@Overridepublic void onComplete(Object response) {if (null == response) {FileCodeUtil.showResultDialog(LoginActivity.this, "返回为空", "登录失败");return;}JSONObject jsonResponse = (JSONObject) response;if (jsonResponse.length() == 0) {FileCodeUtil.showResultDialog(LoginActivity.this, "返回为空", "登录失败");return;}FileCodeUtil.showResultDialog(LoginActivity.this, response.toString(), "登录成功");doComplete((JSONObject) response);}protected void doComplete(JSONObject values) {}@Overridepublic void onError(UiError e) {FileCodeUtil.toastMessage(LoginActivity.this, "onError: " + e.errorDetail);FileCodeUtil.dismissDialog();}@Overridepublic void onCancel() {FileCodeUtil.toastMessage(LoginActivity.this, "onCancel: ");FileCodeUtil.dismissDialog();}}
(6)数据回调成功后,去把头像用户之类的数据,更新显示出来。就得创建线程去更新UI数据
//下面的msg.what的值,来自updateUserInfo()的DefaultUiListener回调接口Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0) {JSONObject response = (JSONObject) msg.obj;if (response.has("nickname")) { //提取QQ昵称参数try {//成功就执行的操作//mUserInfo.setVisibility(android.view.View.VISIBLE);设置用户名可见//mUserInfo.setText(response.getString("nickname"));//设置QQ昵称刀TextView上} catch (JSONException e) {e.printStackTrace();}}} else if(msg.what == 1){/** 需要更新的操作 *///Bitmap bitmap = (Bitmap)msg.obj; 更新ImageViwe为QQ头像//mUserLogo.setImageBitmap(bitmap);//mUserLogo.setVisibility(android.view.View.VISIBLE);}}};
(7)这个方法放在登录点击按钮处调用
private void updateUserInfo() {/ ** 回掉成功后解析数据,Message发送数据UI线程if (mTencent != null && mTencent.isSessionValid()) {IUiListener listener = new DefaultUiListener() {@Overridepublic void onError(UiError e) {}@Overridepublic void onComplete(final Object response) {Message msg = new Message();msg.obj = response;msg.what = 0;mHandler.sendMessage(msg);new Thread(){@Overridepublic void run() {JSONObject json = (JSONObject)response;if(json.has("figureurl")){Bitmap bitmap = null;try {bitmap = Util.getbitmap(json.getString("figureurl_qq_2"));} catch (JSONException e) {SLog.e(TAG, "Util.getBitmap() jsonException : " + e.getMessage());}Message msg = new Message();msg.obj = bitmap;msg.what = 1;mHandler.sendMessage(msg);}}}.start();}@Overridepublic void onCancel() {}};UserInfo info = new UserInfo(this, mTencent.getQQToken());info.getUserInfo(listener);} else {/** 未登录状态 *///mUserInfo.setText("");//mUserInfo.setVisibility(android.view.View.GONE);//mUserLogo.setVisibility(android.view.View.GONE);}}
(8)自己的应用程序与腾讯QQ应用程序数据交互,必须使用onActivityResult来接收返回的数据
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {Log.d(TAG, "-->onActivityResult " + requestCode + " resultCode=" + resultCode);if (requestCode == Constants.REQUEST_LOGIN ||requestCode == Constants.REQUEST_APPBAR) {Tencent.onActivityResultData(requestCode,resultCode,data,loginListener);}super.onActivityResult(requestCode, resultCode, data);}
5.总结
仅自己学习记录,如有错误,敬请谅解~,谢谢~~~
(AS笔记)Android 实现第三方QQ登录——QQ互联相关推荐
- 第三方客户端登录QQ邮箱遇到“无法验证账户名或密码”问题解决
由于好久没有再登录QQ邮箱了,今天使用MBP的mail客户端登录了下,竟然一直出现无法验证账户名或密码的问题,很是纳闷呀...以图为证? 解决步骤: 登录qq邮箱https://mail.qq.com ...
- php 第三方qq 登录,QQ第三方登录
### 前置条件 1. 一个QQ号. 2. 一台公网通过域名可访问的web服务器. 3. 需要备案 . ### QQ登录流程 1. 打开网站QQ互联 : [http://connect.qq.com] ...
- WebView Attack In Android : 解析第三方账号登录平台所存在的安全隐患
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17663345 前言 这是一个很有趣的话题,WebView在Android中包 ...
- Android 微信第三方绑定登录详解
赢第三方微信登录跟微信支付差别不是很大,下面一一为大家分享一下,欢迎吐槽指正. 接入微信的支付要第一步添加微信支付官方的包libammsdk.jar 一.配置文件Androidmanifest < ...
- java 模拟qq空间登陆_java最新完美实现模拟登录QQ登录QQ空间获取说说
package com.pengliu.config; import com.pengliu.util.http.HttpService; /** * desc: 全局公共属性配置 */ public ...
- JavaWeb项目调用QQ登录----QQ互联
首先要做的在QQ互联申请项目QQ互联官网首页 ,申请通过会得到APPID , APPKey 一 : 在HTML/JSP页面放置符合QQ互联标准的QQ登录图标 附代码: <a href=&quo ...
- JAVA-快速接入第三方应用登录(QQ、微信、微博)
前言:如何快速接入第三方登录?无需第三方审核认证授权,一次性接入多个平台的解决方案, 此处实现使用SpringBoot+vue 实现此效果 1.申请接入应用 http://open.51094.com ...
- Android集成第三方微信登录
第一步: 在微信开放平台创建安卓应用,需要输入的包名和签名就不用再提吧,不知道的自行百度. 应用创建完毕后会得到两个值:AppID.AppSecret,用这两个值来请求微信. 然后去微信开放平台的 ...
- 手把手教你Android集成第三方微信登录
最近公司要求集成第三方的微信登录功能,以前没做过,现在做完梳理下思路. 1.首先要在微信开放平台注册你的APP.获取APP的id和APPSecret. 2.然后要集成微信的sdk jar包 3.创建一 ...
- Android 实现第三方Facebook登录的具体实现
前言:因为之前做的项目中需要接入Facebook登录,所以为大家带来Facebook的eclipse版本.在这里简单具体说一下接入的过程中的一些问题和注意的事项,希望为大家解决一些遇到的问题和坑.坑. ...
最新文章
- Android如何实现简单音乐播放器的代码
- vue:model和v-model的区别
- ICPC网络赛第二场G Limit
- 美妆海报模板|来点创意的海报设计(立体剪纸风格)
- 【数据结构】进击的二叉查找树
- 求一个容器的最值的索引_初中几何最值——瓜豆原理模型分析
- c语言oj得pe,ACM入门之OJ~
- [读书]《罗辑思维》第一季、第二季推荐书籍清单
- 大数取模运算Barrett reduction
- 安全防范报警系统产品质量监督检测测试中心(上海)
- 期货期权股票资管分仓系统(子账户系统、风控系统)的功能介绍
- Java 算法:带权图Weighted Graph
- 反向代理和正向代理的区别介绍
- Windows 在目录中搜索哪个文件中有指定字符串
- RRC连接、RL、RB、RAB的本质是什么?
- ArcGis之椭球面积计算工具
- 凑齐三块国字号“招牌”,长沙要召唤智能汽车产业的“神龙”了
- 3D游戏引擎剖析【较全面】
- 网络拓扑 代码 matlab,matlabdaima 复杂网络拓扑特征统计的编程代码,可以计算 中各种 值 Other systems 其他 246万源代码下载- www.pudn.com...
- 中柏ezpadE7装linux,中柏EZpad i7怎么样 中柏EZpad i7详细评测
热门文章
- mysql front连接_mysql server连接mysql-front方法
- 植物大战僵尸音乐计算机简谱,植物大战僵尸主题曲简谱|植物大战僵尸主题曲:Zombies on Your Lawn...
- 20款优秀的数据可视化工具 (建议收藏)
- 2022-2028年中国汽车紧固件行业市场深度分析及投资决策建议报告
- 紧固件基础知识之规格篇和功能篇
- 提供全套Python教学资源和考试系统,全力打造良心服务
- 工具说明书 - 滚动截屏和录屏软件ShareX
- 直击DTCC2018 阿里数据库技术干货全面解析
- Paper--3d reconstruction:Photo Tourism: Exploring Photo Collections in 3D
- android ps icon图标制作,PS设计App图标教程