前言
之前写过一篇Android实现的QQ登录文章,但是由于腾讯官网已经将QQ登录功能迁移到了 QQ互联
上了,所以之前的就没怎么看了。那么这篇文章就让我们来学习下Android实现QQ第三方登录
功能吧。这里我将qq登录
做了相关封装,下面就来做具体介绍吧
今天的讲解涉及以下内容:
- qq登录功能前期准备
1.1 官网注册账号
1.2 官网上创建应用
1.3 下载qq登录所需 jar - 封装类简单介绍
- 使用前配置
3.1 准备你项目所需appId
3.2 配置Androidmanifast文件
3.3 在自定义Application中做登录初始化
3.4 数据解析引入依赖 - qq登录封装类在activity中使用
- 效果图和项目结构图
- qq登录相关封装类源码
6.1 数据接收实体类
6.2 qq登录涉及类
先来波效果图吧
登录效果图.gif
一. qq登录功能前期准备
在实现qq登录
功能前,我们需要做些必要准备。
1.1 官网注册账号
先到 QQ互联官网 注册一个开发者账号,在个人信息界面根据提示填写必要的信息,最后上传自己手持身份证照片,这里需要注意的是,照片中,身份证图片中头像要在右边。搞定后,提交个人信息,等待官方审核
1.2 官网上创建应用
在QQ互联官网 登录开发者账号后,在首页点击应用管理
,如下:
在下一界面,选择
移动应用
,创建应用
,然后根据提示,填写应用必要的信息,图片没有的话,就把你项目的默认icon传上去也行,然后提交,等待官方审核,审核通过后,界面大概如下:image.png
ok,这样,账号及应用需要
AppID
,准备好了。
1.3 下载qq登录所需 jar
到 QQ互联官网 首页点击文档资料
,如下:
在新的界面左边的导航中,找到
SDK及资源下载
----> SDK下载
,如下图image.png
在右侧找到
android sdk
下载处,如下图image.png
上图中最新的 android sdk版本为
Android_SDK_V3.5.0
,下载下来。下载下来的zip,解压出来,找到相关
jar
,如我找到的jar
显示如下图image.png
将此
jar
导入到你的项目中,作为依赖使用。到此,准备工作已经就绪。
二. 封装类简单介绍
qq三方登录主要有两个流程,第一个是获取qq授权
,授权成功后,会得到qqtoken等相关信息,然后拿着此信息进入第二流程获取用户登录基本信息
这里我将QQ登录
所需代码做了简单封装,主要涉及以下四个类:
- QQAuthorListener : qq登录授权监听
- QQInfoListener: qq授权成功后,拉取用户信息的监听
- QQLoginHelper: qq登录帮助类,我们调用qq登录方法时,只要关注此类就行
- QQStatus:qq登录状态码
三. 使用前配置
3.1 准备你项目所需appId
这里我们需要你项目所需要的appId
(假设appId="123456"),这在前面已经讲过了,然后是你项目的 packageName
全称(j假设 packageName="com.test")
3.2 配置Androidmanifast文件
在Androidmanifast
中配置以下权限:
<!-- 需要权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
然后在applicaton
标签下配置qq登录
所需activity
(假设appId="123456"):
<application
//其他代码省略
//...... >
<!-- QQ互联第三方登录 -->
<activity
android: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="tencent123456" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
//其他代码省略
//......
</application>
这里需要注意的是,假设你AppId="123456"
,则在androidmanifast.xml
中配置AuthActivity
时,要在其子标签<data android:scheme="xxxx" />
中给scheme
赋值tencent123456
,即<data android:scheme="tencent123456" />
,注意scheme的值是tencent
+你的appId
连一起的。
3.3 在自定义Application中做登录初始化
在你项目自定义Application
中做登录初始化,如我项目自定义Application
为AppContext
,则相关初始化如下:
public class AppContext extends ComContext {
@Override
public void onCreate() {
super.onCreate();
//初始化登录设置
QQLoginHelper.getInstance().setAppID("123456") //这里填入你的appId,这里假设是123456
.setPackageName("com.test") //这里设置你的项目包名全称,这里假设是com.test
.init();
}
}
3.4 数据解析引入依赖
这里在封装的及各类中,有涉及到数据接收解析问题,我用的是Gson解析,所以,你还需要在你app_module
对应的build.gradle
中添加Gson
依赖:
//gson
implementation 'com.google.code.gson:gson:2.8.5'
四. qq登录封装类在activity中使用
qq登录调用时,主要涉及到QQLoginHelper
类,下面给出其在TempActivity
中使用代码:
public class TempActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mTv;
private Button mBtnLogin;
private Button mBtnLoginOut;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp);
//初始化控件
initView();
//初始化数据
initData();
//控件监听
setListener();
}
/**初始化控件**/
private void initView(){
mTv=findViewById(R.id.tv);
mBtnLogin=findViewById(R.id.btn);
mBtnLoginOut=findViewById(R.id.btn_login_out);
}
/**初始化数据**/
private void initData(){
}
/**控件监听**/
private void setListener() {
//登录
mBtnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
login(mTv,mBtnLogin,TempActivity.this);
}
});
//退出
mBtnLoginOut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//退出
QQLoginHelper.getInstance().loginOut(TempActivity.this);
LogUtil.i("=======退出登录了=======");
}
});
}
private void login(TextView textView,Button btn,Context context){
//登录
QQLoginHelper.getInstance().login(context, new QQLoginHelper.OnLoginListener() {
@Override
public void loginStatus(int code, String message, Object obj) {
switch (code) {
case QQStatus.START_LOGIN_APPLY://正在申请登录授权
if(textView!=null) {
textView.setText("正在申请登录授权,请稍后...");
}
if(btn!=null) {
//禁止按钮点击
btn.setEnabled(false);
}
break;
case QQStatus.LOGIN_APPLY_CANCEL://登录授权取消
if(textView!=null) {
textView.setText("登录授权取消...");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
break;
case QQStatus.LOGIN_APPLY_FAILED_NULL://登录授权失败
case QQStatus.LOGIN_APPLY_FAILED://登录授权失败
if(textView!=null) {
textView.setText("登录授权失败");
}
if(btn!=null){
//按钮恢复点击
btn.setEnabled(true);
}
break;
case QQStatus.LOGIN_APPLY_PARSE_FAILED_NULL://登录授权数据解析失败
case QQStatus.LOGIN_APPLY_PARSE_FAILED://登录授权数据解析失败
if(textView!=null) {
textView.setText("登录授权数据解析失败");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
break;
case QQStatus.LOGIN_APPLY_SUCCESS://登录授权成功,正在获取登录信息
if(textView!=null) {
textView.setText("登录授权成功,正在获取登录信息...");
}
//按钮仍然禁止点击,此处不做处理
break;
case QQStatus.LOGIN_INVALID://未登录或登录过期
if(textView!=null) {
textView.setText("尚未登录或已登录过期,请重新登录");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
break;
case QQStatus.LOGIN_INFO_CANCEL://拉取用户登录信息已被取消
if(textView!=null) {
textView.setText("拉取用户登录信息被取消");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
break;
case QQStatus.LOGIN_INFO_FAILED_NULL://拉取用户登录信息失败
case QQStatus.LOGIN_INFO_FAILED://拉取用户登录信息失败
if(textView!=null) {
textView.setText("获取用户登录信息失败");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
break;
case QQStatus.LOGIN_INFO_PARSE_FAILED_NULL://拉取用户登录信息解析失败
case QQStatus.LOGIN_INFO_PARSE_FAILED://拉取用户登录信息解析失败
if(textView!=null) {
textView.setText("获取用户登录信息解析失败");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
break;
case QQStatus.LOGIN_INFO_SUCCESS://获取登录信息成功(登录成功)
if(textView!=null) {
textView.setText("获取登录信息成功");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
//打印用户信息
LoginInfo loginInfo = (LoginInfo) obj;
LogUtil.i("======loginInfo====" + loginInfo.toString());
if(textView!=null) {
StringBuffer buffer=new StringBuffer();
buffer.append("获取登录信息成功\n");
buffer.append("昵称:"+loginInfo.getNickname()+"\n");
buffer.append("性别:"+loginInfo.getGender()+"\n");
buffer.append("性别类型:"+loginInfo.getGender_type()+"\n");
buffer.append("省:"+loginInfo.getProvince()+"\n");
buffer.append("市:"+loginInfo.getCity()+"\n");
buffer.append("年:"+loginInfo.getYear()+"\n");
buffer.append("等级:"+loginInfo.getLevel());
textView.setText(buffer.toString());
}
break;
case QQStatus.LOGIN_OUT_SUCCESS://退出登录成功
if(textView!=null) {
textView.setText("退出登录成功");
}
if(btn!=null) {
//按钮恢复点击
btn.setEnabled(true);
}
break;
default:
break;
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
QQLoginHelper.getInstance().onActivityResultData(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onClick(View v) {
}
}
五. 效果图和项目结构图
登录效果图.gif项目结构图.png
六.qq登录相关封装类源码
6.1 数据接收实体类
授权和登录过程成功后,会涉及到数据接收问题,这里涉及到两个实体类Author
,LoginInfo
。
下面给出Author
代码:
网友评论