
近年来三方导流,方便用户使用App,以及方便App数据分享越来越多的App支持了三方登录以及三方分享网页和图片.在此,整理了一系列三方库的集成方法以及集成中遇到的问题
一:包引用
1:Maven引用
implementation 'com.tencent.tauth:qqopensdk:3.52.0'
2:jar 包下载
下载地址
Jar包
二:SDK三方配置
1:AndroidManifest.xml配置
<!--SDK需要的权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<!--qq配置-->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!--tencent你的AppId-->
<data android:scheme="xxxid" />
</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" />
<activity android:name=".QQThirdActivity"/>
</application>
2:Activity调用页面配置(且QQ的监听只能在Activity中监听)

package com.wu.third
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.tencent.tauth.IUiListener
import com.tencent.tauth.Tencent
import com.tencent.tauth.UiError
import com.wu.third.databinding.ActivityQqBinding
class QQThirdActivity : AppCompatActivity(), IUiListener {
var mTencent: Tencent? = null
//qq的权限
val ACOPE_ALL = "all"
val url = "https://www.baidu.com/"
var img = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.redocn.com%2Fsheying%2F20140704%2Fyuntaishanfengjing_2695407.jpg&refer=http%3A%2F%2Fimg.redocn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639293976&t=cc27d9362325a51c8ee2c2c16a6dbe25"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding = DataBindingUtil.setContentView<ActivityQqBinding>(this, R.layout.activity_qq)
mTencent = Tencent.createInstance("xxxx", this.getApplicationContext())
binding.btLogin.setOnClickListener {
//QQ 登录
if (mTencent!!.isQQInstalled(this))mTencent!!.login(this, ACOPE_ALL, this)
}
binding.btShare.setOnClickListener {
//QQ分享网页
if (mTencent!!.isQQInstalled(this)) ThirdUtil.shareQQ(this, mTencent!!, "标题", "这是简介", img, url)
}
binding.btShareImg.setOnClickListener {
//QQ分享图片
if (mTencent!!.isQQInstalled(this))
ThirdUtil.shareQQImg(this, mTencent!!, "path");
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//设置回调
Tencent.onActivityResultData(requestCode, resultCode, data, this)
}
//成功
override fun onComplete(p0: Any?) {
ThirdUtil.loginQQ(this, mTencent!!, p0!!)
}
//失败
override fun onError(p0: UiError?) {
}
//取消
override fun onCancel() {
}
override fun onWarning(p0: Int) {
}
}
三:功能实现
1:SDK登录
1.调用登录方法
//QQ登录
if (mTencent!!.isQQInstalled(this)) mTencent!!.login(this, ACOPE_ALL, this)
2.登陆回调执行:执行IUiListener回调,获取Object数据

3:获取数据
//QQ 登录
fun loginQQ(context: Context, mTencent: Tencent, any: Any) {
var jsObj = any as JSONObject
if (jsObj != null) {
var ret = jsObj.getInt(SocialConstants.PARAM_OPEN_ID)
//授权成功
if (ret == 0) {
//此处登录授权成功
val openId: String = jsObj.getString(SocialConstants.PARAM_OPEN_ID)
val access_token: String = jsObj.getString(Constants.PARAM_ACCESS_TOKEN)
val expires: String = jsObj.getString(Constants.PARAM_EXPIRES_IN)
mTencent.openId = openId
mTencent.setAccessToken(access_token, expires)
//获取用户唯一ID
getUnionId(
context,
mTencent
)
} else {
// todo 授权失败
}
}
}
4.获取UnionID
//获取用户唯一ID
private fun getUnionId(context: Context, mTencent: Tencent) {
var listener = object : IUiListener {
override fun onComplete(response: Any?) {
if (response != null) {
val jsonObject = response as JSONObject
try {
val unionid = jsonObject.getString("unionid")
getUserInfo(
context,
mTencent,
unionid
)
} catch (e: Exception) {
// todo 数据异常
}
} else {
// todo 数据异常
}
}
override fun onError(p0: UiError?) {
// todo 获取唯一ID失败
}
override fun onCancel() {
}
override fun onWarning(p0: Int) {
}
}
val unionInfo = UnionInfo(context, mTencent.qqToken)
unionInfo.getUnionId(listener)
}
5.获取用户信息
//获取用户信息
private fun getUserInfo(context: Context, mTencent: Tencent, unionid: String) {
val info = UserInfo(context, mTencent.qqToken)
info.getUserInfo(object : IUiListener {
override fun onComplete(value: Any?) {
val jsonObject = value as JSONObject
if (jsonObject == null) return
//名字
val name = jsonObject.getString("nickname")
//头像
val urlface = jsonObject.getString("figureurl_qq")
//性别
val gender = jsonObject.getString("gender")
//省会
val province = jsonObject.getString("province")
//城市
val city = jsonObject.getString("city")
Log.e("QQ数据", name + ":" + urlface + ":" + gender + ":" + province + ":" + city)
}
override fun onError(p0: UiError?) {
// todo 用户信息失败
}
override fun onCancel() {
}
override fun onWarning(p0: Int) {
}
})
}
2:SDK分享网页
//分享网页
fun shareQQ(
context: QQThirdActivity,
mTencent: Tencent,
title: String,
desc: String,
imgUrl: String,
url: String
) {
val params = Bundle()
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT) //分享类型 分享网页
params.putString(
QQShare.SHARE_TO_QQ_TITLE,
title
) // 标题 限制(长度 128 )QQ_SHARE_TITLE_MAX_LENGTH
params.putString(
QQShare.SHARE_TO_QQ_SUMMARY,
desc
) // 摘要限制(512) QQ_SHARE_SUMMARY_MAX_LENGTH = 512
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, url) // 内容地址 最好控制下长度 长连接报过错
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imgUrl) // 网络图片地址(本地地址)
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "xxx") // 应用名称
// 分享操作要在主线程中完成
mTencent.shareToQQ(context, params, object : IUiListener {
override fun onComplete(p0: Any?) {
// todo 分享成功
}
override fun onError(p0: UiError?) {
// todo 分享失败
}
override fun onCancel() {
}
override fun onWarning(p0: Int) {
}
})
}
3.分享图片
// 分享图片
fun shareQQImg(qqThirdActivity: QQThirdActivity, mTencent: Tencent, path: String) {
val params = Bundle()
params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, path) //分享图片地址 最好做个限制大小
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "xxxApp")// 应用名称
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE)//分享类型 分享图片
// 分享操作要在主线程中完成
mTencent.shareToQQ(qqThirdActivity, params, object : IUiListener {
override fun onComplete(p0: Any?) {
// todo 分享成功
}
override fun onError(p0: UiError?) {
// todo 分享失败
}
override fun onCancel() {
}
override fun onWarning(p0: Int) {
}
})
}
总结:
三方库简单的集成以及主要功能实现,以此记录,欢迎问题探讨,来都来了点个赞再走吧!!!
网友评论