(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.jarmta-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.connect.common.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.总结

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

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电竞丶小松哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值