admin 管理员组文章数量: 1086019
目录
- 1.获取应用AppId
- 2.获取并配置SDK开发包
- 3.AndroidManifest.xml引入SDK资源
- 4.代码引入
- 5.总结
1.获取应用AppId
(1)QQ互联官网申请:https://connect.qq/
说明:登录后,首先认证个人开发者,然后才有权限创建应用,申请填资料的时候,务必真实信息,不然审核打回来,得等很久才通过。
(2)登录个人开发者QQ:移动应用——开始创建
(3)进入控制台——应用管理——创建应用
(4)选择:创建移动应用
(5)根据自身情况:资料填写
(6)APP应用签名+logo
签名工具内容如下:
(7)创建成功,得到的APPID将在AndroidStudio中使用
2.获取并配置SDK开发包
(1)下载链接:https://wiki.connect.qq/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登录 -->
<activity
android:name="com.tencent.connectmon.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android: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() {
@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.总结
仅自己学习记录,如有错误,敬请谅解~,谢谢~~~
版权声明:本文标题:(AS笔记)Android 实现第三方QQ登录——QQ互联 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1738249505a1950094.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论