对接第三方qq登录

在qq互联上登录创建应用,【有注册开发者身份】QQ互联,然后下载对应的sdk,去下载

之后解压。

创建一个工程【或原有的工程里】,并把open-sdk.jar(压缩包中文件名为:open_sdk_xxxx_lite.jar)文件拷贝到libs(或lib)目录下,如下图所示:

《对接第三方qq登录》

然后配置AndroidManifest;
在应用的AndroidManifest.xml增加配置的<application>节点下增加以下配置(注:不配置将会导致无法调用API);

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
 <activity
       android:name="com.tencent.tauth.AuthActivity"
       android:noHistory="true"
       android:launchMode="singleTask" >
    <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="tencent你的AppId" />
    假如你的appid是12345
 <data android:scheme="tencent12345 />
    </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>

接着初始化SDK

3.5.7版本新增接口提供用户设置是否已授权获取设备信息,在调用互联SDK相关功能接口之前,需要应用在确认用户已授权应用获取设备信息后,调用下面代码通知 SDK:

Tencent.setIsPermissionGranted(true);

如果未调用该接口或传参为false时,调用其它功能接口将直接返回失败。

示例代码

 



public class OneClickLoginActivity extends AppCompatActivity {
    private static final String TAG = "OneClickLoginActivity";
    private static final String APP_ID = "123456";//你的qq互联上面的appid
    @BindView(R.id.ll_qq_login)
    LinearLayout llQqLogin;
    @BindView(R.id.iv_wb_icon)
    ImageView ivWbIcon;
    @BindView(R.id.tv_wb)
    TextView tvWb;
    public static Tencent mTencent;
    //QQ包名
    private static final String PACKAGE_QQ = "com.tencent.mobileqq";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one_click_login);
        Tencent.setIsPermissionGranted(true);
        ButterKnife.bind(this);
        mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());

    }


    @OnClick({R.id.ll_qq_login})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.ll_qq_login:
            
                if (!hasApp(PACKAGE_QQ)) {
                    Toast.makeText(OneClickLoginActivity.this, "未安装QQ应用",
                            Toast.LENGTH_SHORT).show();
                    return;
                }
                loginQQ();
                break;

        }
    }

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

    private void getUnionId() {
        if (mTencent != null && mTencent.isSessionValid()) {
            IUiListener listener = new IUiListener() {
                @Override
                public void onError(UiError e) {
                    Toast.makeText(OneClickLoginActivity.this, "onError", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onComplete(final Object response) {
                    if (response != null) {
                        JSONObject jsonObject = (JSONObject) response;                  
                        try {
                            String unionid = jsonObject.getString("unionid");

                        } catch (Exception e) {
                            Toast.makeText(OneClickLoginActivity.this, "no unionid", Toast.LENGTH_LONG).show();
                        }
                    } else {
                        Toast.makeText(OneClickLoginActivity.this, "no unionid", Toast.LENGTH_LONG).show();
                    }
                }

                @Override
                public void onCancel() {
                    Toast.makeText(OneClickLoginActivity.this, "onCancel", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onWarning(int i) {

                }
            };
            UnionInfo unionInfo = new UnionInfo(this, mTencent.getQQToken());
            unionInfo.getUnionId(listener);
        } else {
            Toast.makeText(this, "please login frist!", Toast.LENGTH_LONG).show();
        }
    }

    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);
                    //获取UnionId
                    getUnionId();
                    //获取个人信息
                    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, "登录取消");

            }

            @Override
            public void onWarning(int i) {

            }
        };
        //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());
                    //头像
                    String avatar = ((JSONObject) object).getString("figureurl_2");
                    String nickName = ((JSONObject) object).getString("nickname");

                    if (!avatar.equals("")) {
//需要添加Glide库进行图片展示                        Glide.with(OneClickLoginActivity.this).load(avatar).into(ivWbIcon);
                    }
                    tvWb.setText(nickName);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(UiError uiError) {
            }

            @Override
            public void onCancel() {
            }

            @Override
            public void onWarning(int i) {

            }
        });
    }

    /**
     * 回调必不可少,官方文档未说明
     */
    @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(String packName) {

        boolean is = false;
        List<PackageInfo> packages = getPackageManager()
                .getInstalledPackages(0);
        for (PackageInfo packageInfo : packages) {
            // 判断系统/非系统应用
            if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) // 非系统应用
            {

                String packageName = packageInfo.packageName;


                if (packageName.equals(packName)) {
                    is = true;
                }

            } else {
                // 系统应用
            }
        }

        return is;
    }
}

注。获取unionid在QQ互联上默认是不开启的,需要你自己手动开启,在下面的位置【需要绑定】

《对接第三方qq登录》

 

 

 

    原文作者:白马镇的少年
    原文地址: https://blog.csdn.net/qq_37328546/article/details/121465997
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞