美文网首页简书付费文章
Android实现QQ第三方登录

Android实现QQ第三方登录

作者: 奔跑的佩恩 | 来源:发表于2020-10-13 11:17 被阅读0次

    前言

    之前写过一篇Android实现的QQ登录文章,但是由于腾讯官网已经将QQ登录功能迁移到了 QQ互联上了,所以之前的就没怎么看了。那么这篇文章就让我们来学习下Android实现QQ第三方登录功能吧。这里我将qq登录做了相关封装,下面就来做具体介绍吧

    今天的讲解涉及以下内容:

    1. qq登录功能前期准备
      1.1 官网注册账号
      1.2 官网上创建应用
      1.3 下载qq登录所需 jar
    2. 封装类简单介绍
    3. 使用前配置
      3.1 准备你项目所需appId
      3.2 配置Androidmanifast文件
      3.3 在自定义Application中做登录初始化
      3.4 数据解析引入依赖
    4. qq登录封装类在activity中使用
    5. 效果图和项目结构图
    6. qq登录相关封装类源码
      6.1 数据接收实体类
      6.2 qq登录涉及类

    先来波效果图吧


    登录效果图.gif

    一. qq登录功能前期准备

    在实现qq登录功能前,我们需要做些必要准备。

    1.1 官网注册账号

    先到 QQ互联官网 注册一个开发者账号,在个人信息界面根据提示填写必要的信息,最后上传自己手持身份证照片,这里需要注意的是,照片中,身份证图片中头像要在右边。搞定后,提交个人信息,等待官方审核

    1.2 官网上创建应用

    QQ互联官网 登录开发者账号后,在首页点击应用管理,如下:

    image.png
    在下一界面,选择移动应用创建应用,然后根据提示,填写应用必要的信息,图片没有的话,就把你项目的默认icon传上去也行,然后提交,等待官方审核,审核通过后,界面大概如下:
    image.png
    ok,这样,账号及应用需要 AppID,准备好了。
    1.3 下载qq登录所需 jar

    QQ互联官网 首页点击文档资料,如下:

    image.png
    在新的界面左边的导航中,找到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中做登录初始化,如我项目自定义ApplicationAppContext,则相关初始化如下:

    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 数据接收实体类

    授权和登录过程成功后,会涉及到数据接收问题,这里涉及到两个实体类AuthorLoginInfo
    下面给出Author代码:

    相关文章

      网友评论

        本文标题:Android实现QQ第三方登录

        本文链接:https://www.haomeiwen.com/subject/akgppktx.html