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()
}
}