(AS笔记)Android 实现第三方QQ登录

您所在的位置:网站首页 手机qq登录找不到网页 (AS笔记)Android 实现第三方QQ登录

(AS笔记)Android 实现第三方QQ登录

2024-07-08 15:56| 来源: 网络整理| 查看: 265

目录 1.获取应用AppId2.获取并配置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页面,添加如下:

        (2)添加Android应用权限项

        (3)注册SDK需要跳转的Activity,这是SDK封装好的,只需要注册在标签中,就能调用SDK的功能了。

说明:  需要替换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() { @Override protected 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 { @Override public 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) { } @Override public void onError(UiError e) { FileCodeUtil.toastMessage(LoginActivity.this, "onError: " + e.errorDetail); FileCodeUtil.dismissDialog(); } @Override public void onCancel() { FileCodeUtil.toastMessage(LoginActivity.this, "onCancel: "); FileCodeUtil.dismissDialog(); } }

        (6)数据回调成功后,去把头像用户之类的数据,更新显示出来。就得创建线程去更新UI数据

//下面的msg.what的值,来自updateUserInfo()的DefaultUiListener回调接口 Handler mHandler = new Handler() { @Override public 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() { @Override public void onError(UiError e) { } @Override public void onComplete(final Object response) { Message msg = new Message(); msg.obj = response; msg.what = 0; mHandler.sendMessage(msg); new Thread(){ @Override public 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(); } @Override public 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来接收返回的数据

@Override protected 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.总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~ 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3