QQ登录,比官方文档靠谱(踩坑记录)

1、导入jar

官方:

实际:

官方告诉你要导入两个jar,但是你会发现下载的压缩包中只有一个open_sdk_xxx_lite.jar,是不是会有点懵。另外一个jar是在腾讯的移动数据分析平台下载,https://mta.qq.com/。

 

2、配置AndroidManifest

官方

  <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" />
    </intent-filter>


实测

这步官方文档没有问题。以下是两个使用appid的地方注意一下就好。

1、<data android:scheme="tencent你的AppId" 这里应该是“Tencent12233334445”的样式,切记不要只填写appid

  2、

// 其中APP_ID是分配给第三方应用的appid,类型为String。

mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());

这里的appid就是12233334445


 

3、实现回调

官方

实测

官方重点提示了,需要复写onActivityResult方法,并添加mTencent.onActivityResult(requestCode, resultCode, data)代码,但是你按照官方的写法写完后,发现依旧不能接到回调。

以下是实测可用方法

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == Constants.REQUEST_LOGIN) {
            mTencent.handleLoginData(data, this)
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

4、调用QQ登录接口

官方

public void login()
    {
    	mTencent = Tencent.createInstance(AppId, this.getApplicationContext());
		if (!mTencent.isSessionValid())
		{
			mTencent.login(this, Scope, listener);
		}
    }

实测

这步文档也没有问题,但是如果你还要获取用户信息,那么这里有一个很多大的坑。下面说

5、获取用户信息

官方

实测

官方给出了两种获取用户信息的方式,但是你会发现Constants中根本没有GRAPH_SIMPLE_USER_INFO这个常量(心里NMB)

实测方法,

fun getUserInfoInThread() {
        var userInfo: UserInfo = UserInfo(this, mTencent.getQQToken());
        userInfo.getUserInfo(object : IUiListener {
            override fun onComplete(p0: Any?) {
            }

            override fun onCancel() {
            }

            override fun onError(p0: UiError?) {
            }
        });


    }

这就完事了?小伙子你还是太年轻啊,还记的第4步说坑吗?其实这里是官方没有提到的一个关键点,一般我们在QQ登录后会获取用户信息,而在官方文档中恰恰缺少了,这两部中间的关键代码,如果你没有加的话,会发现你无法获取用户信息,错误信息提示你client request's parameters are invalid, invalid openid。下面两行代码是串联登录和获取用户信息的关键,放在登录回调的onComplete方法中

  //下面两个方法非常重要,否则会出现client request's parameters are invalid, invalid openid
            mTencent.setOpenId(openID);
            mTencent.setAccessToken(accessToken, expires);

好了到这里就OK了。以下是登录的示例代码,希望可以帮到你

/**
 * 登录
 */
class LoginActivity : BaseActivity<LoginPresenter>(), LoginContract.View, IUiListener {

    lateinit var mTencent: Tencent
    override fun getMyself(): BaseActivity<*> = this

    override fun showNetError() {
    }

    override fun setupActivityComponent(appComponent: AppComponent) {
        DaggerLoginComponent //如找不到该类,请编译一下项目
            .builder()
            .appComponent(appComponent)
            .loginModule(LoginModule(this))
            .build()
            .inject(this)
    }


    override fun initView(savedInstanceState: Bundle?): Int {
        return R.layout.activity_login //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
    }


    override fun initData(savedInstanceState: Bundle?) {
      
        qqIV.singleClick {
            showLoading()
            qqLogin()
        }


    }

    fun qqLogin() {
        mTencent = Tencent.createInstance(Constant.APPID, application)
        if (!mTencent.isSessionValid) {
            mTencent.login(this@LoginActivity, "all", this)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == Constants.REQUEST_LOGIN) {
            mTencent.handleLoginData(data, this)
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

    fun getUserInfoInThread() {
        var userInfo: UserInfo = UserInfo(this, mTencent.getQQToken());
        userInfo.getUserInfo(object : IUiListener {
            override fun onComplete(p0: Any?) {
                println("-------用户信息----${p0.toString()}+")
            }

            override fun onCancel() {
            }

            override fun onError(p0: UiError?) {
            }
        });


    }

    override fun onComplete(p0: Any?) {
        p0 as JSONObject
        var ret: Int = p0.getInt("ret");
        if (ret == 0) {
            var openID: String = p0.getString("openid");
            var accessToken: String = p0.getString("access_token");
            var expires: String = p0.getString("expires_in");
            //下面两个方法非常重要,否则会出现client request's parameters are invalid, invalid openid
            mTencent.setOpenId(openID);
            mTencent.setAccessToken(accessToken, expires);
            getUserInfoInThread()
        }
        hideLoading()
    }

    override fun onCancel() {
        hideLoading()
    }

    override fun onError(p0: UiError?) {
        hideLoading()
    }

    override fun showMessage(message: String) {
        ArmsUtils.snackbarText(message)
    }

    override fun launchActivity(intent: Intent) {
        ArmsUtils.startActivity(intent)
    }

    override fun killMyself() {
        finish()
    }

}

猜你喜欢

转载自blog.csdn.net/LPL0129/article/details/89707956