安卓QQ登录第三方详解

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

1、效果图:
登录前:
安卓QQ登录第三方详解_第1张图片

登录后:
安卓QQ登录第三方详解_第2张图片

2、腾讯SDK下载链接:

http://wiki.open.qq.com/wiki/mobile/SDK下载
安卓QQ登录第三方详解_第3张图片

解压后依次打开opensdk_lite+demo>libs,找到open_sdk_r6008_lite.jar
并复制到如下图目录下,并右键Add As Library
安卓QQ登录第三方详解_第4张图片

腾讯QQ APP ID的获取 注册网址:https://open.tencent.com/
点开管理中心找到即可(应用不需要审核上架)
安卓QQ登录第三方详解_第5张图片

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 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;
    }
}

对应布局文件




    

    

    

    

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

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

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

安卓QQ登录第三方详解_第6张图片

你可能感兴趣的:(安卓分享,登录)