安卓QQ登录第三方详解

前言:以前做登录时都是使用mob等第三方平台,后来看见腾讯自己的SDK实现起来也非常的简介,以此做记录。

1、效果图:
登录前:
在这里插入图片描述

登录后:
在这里插入图片描述

2、腾讯SDK下载链接:

http://wiki.open.qq.com/wiki/mobile/SDK下载
在这里插入图片描述

解压后依次打开opensdk_lite+demo>libs,找到open_sdk_r6008_lite.jar
并复制到如下图目录下,并右键Add As Library
在这里插入图片描述

腾讯QQ APP ID的获取 注册网址:https://open.tencent.com/
点开管理中心找到即可(应用不需要审核上架)
在这里插入图片描述

3、登录界面

public class TestActivity extends AppCompatActivity {

    private static final String TAG = "TestActivity";
    //QQ包名
    private static final String PACKAGE_QQ = "com.tencent.mobileqq";
    //微信包名
    private static final String PACKAGE_WEIXIN = "com.tencent.mm";
    //新浪微博包名
    private static final String PACKAGE_WEIBO = "com.sina.weibo";

    //展示个人信息
    private TextView infoText, infoName;
    private ImageView infoIcon;
    //初始化腾讯服务
    private Tencent mTencent;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        //腾讯AppId(替换你自己App Id)、上下文
        mTencent = Tencent.createInstance("1107123456", this);

        infoText = this.findViewById(R.id.text_info);
        infoIcon = this.findViewById(R.id.info_icon);
        infoName = this.findViewById(R.id.info_name);
        //登录点击事件
        findViewById(R.id.button_login).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //注意:此段非必要,如果手机未安装应用则会跳转网页进行授权
                if (!hasApp(TestActivity.this, PACKAGE_QQ)) {
                    Toast.makeText(TestActivity.this, "未安装QQ应用",
                            Toast.LENGTH_SHORT).show();
                    return;
                }
                //如果session无效,就开始做登录操作
                if (!mTencent.isSessionValid()) {
                    loginQQ();
                }
            }
        });
    }

    /**
     * QQ登录
     */
    private IUiListener listener;

    private void loginQQ() {
        listener = new IUiListener() {
            @Override
            public void onComplete(Object object) {

                Log.e(TAG, "登录成功: " + object.toString() );

                JSONObject jsonObject = (JSONObject) object;
                try {
                    //得到token、expires、openId等参数
                    String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
                    String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
                    String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);

                    mTencent.setAccessToken(token, expires);
                    mTencent.setOpenId(openId);
                    Log.e(TAG, "token: " + token);
                    Log.e(TAG, "expires: " + expires);
                    Log.e(TAG, "openId: " + openId);

                    //获取个人信息
                    getQQInfo();
                } catch (Exception e) {
                }
            }

            @Override
            public void onError(UiError uiError) {
                //登录失败
                Log.e(TAG, "登录失败" + uiError.errorDetail);
                Log.e(TAG, "登录失败" + uiError.errorMessage);
                Log.e(TAG, "登录失败" + uiError.errorCode + "");

            }

            @Override
            public void onCancel() {
                //登录取消
                Log.e(TAG, "登录取消");

            }
        };
        //context上下文、第二个参数SCOPO 是一个String类型的字符串,表示一些权限
        //应用需要获得权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”
        //第三个参数事件监听器
        mTencent.login(this, "all", listener);
        //注销登录
        //mTencent.logout(this);
    }

    /**
     * 获取QQ个人信息
     */
    private void getQQInfo() {
        //获取基本信息
        QQToken qqToken = mTencent.getQQToken();
        UserInfo info = new UserInfo(this, qqToken);
        info.getUserInfo(new IUiListener() {
            @Override
            public void onComplete(Object object) {
                try {
                    Log.e(TAG, "个人信息:" + object.toString());
                    infoText.setText(object.toString());
                    //头像
                    String avatar = ((JSONObject) object).getString("figureurl_2");
                    GlideUtils.showGlide(TestActivity.this, avatar, infoIcon);
                    String nickName = ((JSONObject) object).getString("nickname");
                    infoName.setText(nickName);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(UiError uiError) {
            }

            @Override
            public void onCancel() {
            }
        });
    }

    /**
     * 回调必不可少,官方文档未说明
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //腾讯QQ回调
        Tencent.onActivityResultData(requestCode, resultCode, data, listener);
        if (requestCode == Constants.REQUEST_API) {
            if (resultCode == Constants.REQUEST_LOGIN) {
                Tencent.handleResultData(data, listener);
            }
        }
    }

    /**
     * true 安装了相应包名的app
     */
    private boolean hasApp(Context context, String packName) {
        boolean is = false;
        List<PackageInfo> packages = context.getPackageManager()
                .getInstalledPackages(0);
        for (int i = 0; i < packages.size(); i++) {
            PackageInfo packageInfo = packages.get(i);
            String packageName = packageInfo.packageName;
            if (packageName.equals(packName)) {
                is = true;
            }
        }
        return is;
    }
}

对应布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context=".activity.TestActivity">

    <ImageView
        android:id="@+id/info_icon"
        android:src="@mipmap/ic_launcher"
        android:layout_width="150dp"
        android:layout_height="150dp" />

    <TextView
        android:gravity="center"
        android:id="@+id/info_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp" />

    <TextView
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:id="@+id/text_info"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp" />

    <Button
        android:id="@+id/button_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="QQ登录" />
</LinearLayout>

4、扩展:代码中图片加载框架

    //图片加载
    implementation 'com.github.bumptech.glide:glide:4.7.1'

格式化个人信息:网址:https://www.bejson.com/

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34536167/article/details/83214762