关键词:
ZeroyiQ:Unity 多平台原生SDK接入速览(一):微信开放平台
ZeroyiQ:Unity 多平台原生SDK接入速览(三):Facebook
ZeroyiQ:Unity 多平台原生SDK接入速览(四):Twitter
ZeroyiQ:Unity 多平台原生SDK接入速览(五):微博
一、前言
QQ互联,当前(2020-6-29)支持个人开发者认证和企业认证。创建应用,等待审核后获取 AppID 和 AppKey。
二、SDK接入
1. 添加 jar 包
下载 jar 包,添加到工程 libs 路径下。(Android SDK 中就包含了演示工程 Demo)
2. 设置权限
AndroidManifest.xml 文件中添加网络权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3. 配置 Activity
AndroidManifest.xml 添加 Activity 配置 ,需要填入 AppId。注意格式为 tencent+AppId,例,AppId 是 2222 ,则填入 tencent2222。
<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" />
</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>
4. 初始化
创建 Tencent 实例。
public static final String QQ_ID = "你的AppId";
public static final String AUTHORITIES = "<包名>.fileprovider";
public static Tencent QQ_API;
private void init()
if (!bIsInitialized)
bIsInitialized = true;
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
// 其中APP_ID是分配给第三方应用的appid,类型为String。
// 其中Authorities为 Manifest文件中注册FileProvider时设置的authorities属性值
QQ_API = Tencent.createInstance(QQ_ID, activity.getApplicationContext(), AUTHORITIES);
注,初始化依赖 FileProvider,如果没有添加,可以从 Demo 中找到 Jar 包, 依照 第1步 一样添加 Jar包。
在 AndroidManifest.xml 中配置,替换包名。
上面的创建实例传入的 AUTHORITIES 值与 android:authorities 保持一致。
<application>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="<包名>.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
5. 实现回调
通过实现对应接口,创建和传入对应 Listener,实现请求的回调监听。然而,当前存在两种回调接口。
IUiListener(SDK 封装的情况)
例如:登录、快速支付登录、应用分享、应用邀请等接口,需传入该回调的实例。
private class BaseUiListener implements IUiListener
public static final String TAG = "QQUiListener";
@Override
public void onComplete(Object response)
if (null == response)
UnityCallApi.unityLogError(TAG, "QQ request error. response is null.");
ToastUtils.show(activity, R.string.errcode_null);
return;
JSONObject jsonResponse = (JSONObject) response;
if (jsonResponse.length() == 0)
UnityCallApi.unityLogError(TAG, "QQ request error. response length is 0.");
ToastUtils.show(activity, R.string.errcode_null);
return;
UnityCallApi.unityLogInfo(TAG, "QQ request successfully.");
ToastUtils.show(activity, R.string.errcode_success);
// 有奖分享处理
// handlePrizeShare();
onSuccessful((JSONObject) response);
@Override
public void onError(UiError e)
UnityCallApi.unityLogError(TAG, "QQ request error" + e.toString());
ToastUtils.show(activity, activity.getString(R.string.errcode_unknown) + ", type=" + e.errorMessage);
onFailed();
@Override
public void onCancel()
UnityCallApi.unityLogInfo(TAG, "QQ request cancel.");
ToastUtils.show(activity, R.string.errcode_cancel);
onFailed();
protected void onFailed()
protected void onSuccessful(JSONObject values)
IRequestListener (SDK 未封装的情况)
使用requestAsync、request等通用方法调用sdk未封装的接口时,例如上传图片、查看相册等,需传入该回调的实例。(轻度使用 SDK,将不会涉及该接口 ,故对于接口内容不做展示)
特别注意,为了能收到回调,还需要在调用 SDK 接口的 Activity 的 onActivityResult 添加如下方法。官方文档 中的方法已经被废弃,当前使用的是 Demo 演示中的方法,loginListener 就是 BaseUiListener 的用来处理登录回调的实例。可以根据 requestCode 来判断该响应那个回调。关于 onActivityResult 可以看这个介绍文章,从 otherActivity 切换回来当前 Activity 的时候运行。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
Log.d(TAG, "-->onActivityResult " + requestCode + " resultCode=" + resultCode);
if (requestCode == Constants.REQUEST_LOGIN ||
requestCode == Constants.REQUEST_APPBAR)
// 传递回调
Tencent.onActivityResultData(requestCode,resultCode,data,loginListener);
super.onActivityResult(requestCode, resultCode, data);
三、登录
1.发起登录请求
在初始化 Tencent 后,发起登录请求。
public void login(Activity activity)
this.activity = activity;
// 判断会话是否有效
if (!QQ_API.isSessionValid())
// all 全部作用域,loginListener 就是上文的登录回调
QQ_API.login(activity, "all", loginListener);
Log.d("SDKQQAgentPref", "FirstLaunch_SDK:" + SystemClock.elapsedRealtime());
2.实例化回调
实例化我们之前实现的 IUiListener 的 BaseUiListener 类。
IUiListener loginListener = new BaseUiListener()
@Override
protected void onSuccessful(JSONObject values)
UnityCallApi.unityLogInfo(TAG, "Login successful.");
// 初始化 openId 和 Token
initOpenidAndToken(values);
// 获取用户信息
updateUserInfo();
@Override
protected void onFailed()
UnityCallApi.unityLogInfo(TAG, "Login failed.");
;
注意别忘记前文所说,在 Activity 的 onActivityResult 添加对应的 onActivityResultData。
3.初始化 OpenId 和 Token
使用登陆接口登陆成功以后,在登陆的回调接口保存登陆返回的token和过期时间。
private void initOpenidAndToken(JSONObject jsonObject)
try
String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires) && !TextUtils.isEmpty(openId))
QQ_API.setAccessToken(token, expires);
QQ_API.setOpenId(openId);
QQ_API.saveSession(jsonObject);
catch (Exception e)
e.printStackTrace();
UnityCallApi.unityLogError(TAG, "Parse response to json error.");
四、获取用户信息
在登录后,发送获取用户信息请求。
private void updateUserInfo()
if (QQ_API != null && QQ_API.isSessionValid())
IUiListener listener = new BaseUiListener()
@Override
protected void onSuccessful(JSONObject values)
// 传递到 Unity 中进行解析
UnityCallApi.sendLoginInfoToUnity(true, values.toString());
@Override
protected void onFailed()
UnityCallApi.sendLoginInfoToUnity(false, "");
;
// 只有初始化过 token 后才能 get
UserInfo info = new UserInfo(activity, QQ_API.getQQToken());
info.getUserInfo(listener);
将返回信息传递给 Unity 进行解析。
正确返回的 json。
五、分享
1. 图文(网页)
QQ分享不支持直接分享纯文字,必须要传入跳转 URL。
public void shareWebLink(Bundle params)
Bundle paramsIn = new Bundle();
paramsIn.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT); // 类型 default (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_TARGET_URL,"链接"); // 链接 (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_TITLE,"标题"); // 链接标题 (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_SUMMARY,"摘要"); // 链接摘要 (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"图片URL"); // 本地 or 网络图片 url (可选)
paramsIn.putString(QQShare.SHARE_TO_QQ_APP_NAME, APP_NAME); // 应用名称 客户端顶部替换返回按钮文字 (可选)
paramsIn.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE); // 隐藏 QZone (可选)
// 分享Listener,会添加到 OnActivityResult 中
shareListener = new BaseUiListener()
@Override
protected void onSuccessful(JSONObject values)
// 成功
@Override
protected void onFailed()
// 失败
;
QQ_API.shareToQQ(activity, paramsIn, shareListener);
QQShare.SHARE_TO_QQ_EXT_INT 参数值的分享到 QZone 就是如下界面。
因为跳转到了QQ界面,别忘了为了响应回调,需要在 OnActivityResult 中添加如下代码。
@Override //这段代码非常重要,不加的话无法获取回调
protected void onActivityResult(int requestCode, int resultCode, Intent data)
// 判断是QQ分享结果
if (requestCode == Constants.REQUEST_QQ_SHARE)
Tencent.onActivityResultData(requestCode, resultCode, data, shareListener);
super.onActivityResult(requestCode, resultCode, data);
2. 纯图片
注意纯图片分享是只支持本地图片的,并不支持在线图片。图片大小不能超过 5M。
public void shareImage(Bundle params)
Bundle paramsIn = new Bundle();
paramsIn.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE); // 类型 Image (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, "本地图片路径Path"); // 本地图片路径 (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_APP_NAME, APP_NAME); // 应用名称 客户端顶部替换返回按钮文字 (可选)
paramsIn.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE); // 隐藏 QZone (可选)
shareListener = new BaseUiListener()
@Override
protected void onSuccessful(JSONObject values)
// 成功
@Override
protected void onFailed()
// 失败
;
String localPath = paramsIn.getString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL);
if (!TextUtils.isEmpty(localPath))
File file = new File(localPath);
if (file.length() >= 5 * 1024 * 1024) // 大小不能超过 5M
shareListener.onError(new UiError(Constants.ERROR_IMAGE_TOO_LARGE, Constants.MSG_SHARE_IMAGE_TOO_LARGE_ERROR, null));
return;
QQ_API.shareToQQ(activity, paramsIn, shareListener);
3. 应用
分享其实和图文很类似,重点还是在 SHARE_TO_QQ_TARGET_URL 设置的网页。
public void shareApp(Bundle params)
Bundle paramsIn = new Bundle();
paramsIn.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_APP); // 类型 App (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_TITLE, "标题"); // 链接标题 (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_SUMMARY, "摘要"); // 链接摘要(必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "应用链接"); // 应用链接 (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "应用icon链接"); // 应用icon链接 (必要)
paramsIn.putString(QQShare.SHARE_TO_QQ_APP_NAME, APP_NAME); // 应用名称 客户端顶部替换返回按钮文字 (可选)
paramsIn.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE); // 隐藏 QZone(可选)
shareListener = new BaseUiListener()
@Override
protected void onSuccessful(JSONObject values)
// 成功
@Override
protected void onFailed()
// 失败
;
QQ_API.shareToQQ(activity, paramsIn, shareListener);
六、总结
QQ互联的接入和使用还是简单的。不需要微信那种通过登陆请求获取 code,再通过 code 获取 access token 的操作。并且QQ互联的分享,并不需要登陆也是可以的。官方提供的 SDK 的压缩包中,不光是 SDK,也包含了 Demo 的 APK 和工程项目,这个真的要给好评。
七、引用
- Android_SDK环境搭建 - QQ互联WIKI
- Android FileProvider的使用
- onActivityResult的用法_许佳佳的博客-CSDN博客_protected void onactivityresult
单目全景相机unity3d多平台sdk接入
【单目全景相机】Unity3D多平台SDK接入作者:瓦哥2016.09.16由于本人认知有限,如有错漏,非常欢迎同行指正交流。QQ:454186694什么是多平台SDK接入?Unity3D一般使用C#语言来做开发,Mono做为虚拟机,管理C#... 查看详情
教你高速高效接入sdk——unity统一接入渠道sdk(android篇)
...以支持各种游戏引擎开发的游戏,而不不过Android的原生平台。眼下一大半的手游,都是採用Unity3D和Cocos2dx开发,那么这里,我们就先来一步步给大家演示,用Unity开发的游戏,怎样通过U8SDK来高速地完毕多家渠道SDK的接入。 U... 查看详情
网站接入qq登录
...站接入QQ登录时遇到很多麻烦,主要是QQ互联和腾讯开放平台的关系比较乱,不知道要从哪个接入。最终解决方式:在腾讯开放平台注册个人开发者,验证通过后,在QQ互联平台会有腾讯开放平台的注册信息,然后依次点击个人中... 查看详情
unity5.0接入androidsdk的问题
...支持各种游戏引擎开发的游戏,而不仅仅是Android的原生平台。目前一大半的手游,都是采用Unity3D和Cocos2dx开发,那么这里,我们就先来一步步给大家演示,用Unity开发的游戏,如何通过U8SDK来快速地完成多家渠道SDK的接入。Unity... 查看详情
unity接入微信支付sdk(代码片段)
...c;Unity2020.3.24f1c2,AndroidStudio2021.2.1Patch21.注册微信开放平台,注册应用,申请微信支付,来获取调取SDK的必要参数,此处不展开了(微信开放平台)2.确保开发环境装好,jdk,sdk等,Unity的安卓环境可以... 查看详情
移动app接入qq登录/分享流程
移动App接入QQ登录/分享流程这里先要提两个平台,腾讯开放平台和QQ互联平台:(一)腾讯开放平台官网地址:https://open.tencent.com/介绍:腾讯开放平台是腾讯对开发者公开的一个服务平台,腾讯号称是一个覆盖10亿账户的热门服... 查看详情
unity接入qq登录sdk时遇到的坑2020.9.17
参考技术A>按照视频所述整个流程为:1、新建空工程再新建模块删除布局文件导入unityjar包2、复制app中的xml到模块中添加meta标识unity<meta-dataandroid:name="unityplayer.UnityActivity"android:value="true"/>3、修改MainActivity的继承完善安卓... 查看详情
tsingsee青犀视频平台接入海康解码器sdk实时解码流程(代码片段)
TSINGSEE青犀视频平台前端设备可以接入不同设备,包括NVR、摄像头、编码器等,EasyGBS还可以接入我们独立开发的国标推流平台EasyGBD。一般接入NVR和接入摄像头的项目现场比较多,但也有部分用户是将海康编码器设备... 查看详情
unity实战项目☀️|接入科大讯飞语音sdk如何在科大讯飞平台搞到sdk!系列共两万多字超级新手教程!
📢博客主页:https://blog.csdn.net/zhangay1998📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由呆呆敲代码的小Y原创,首发于CSDN🙉📢未来很长,值得我们全力奔赴更美好的生活✨... 查看详情
unity实战篇|接入声网sdk实现视频通话——自己动手做一个视频通话(代码片段)
...正好在网上看到声网,然后就顺道了解到了声网这个平台,发现声网的功能还真挺多呢也是一个兼容几十种平台的大公司啊,到现在才了解到,也算是相见恨晚~所以就赶紧来用Unity结合声网做一个语音聊天房!... 查看详情
游戏开发教程unityios平台接入微信sdk,实现微信登录等功能(教程|流程讲解)(代码片段)
...登录,答案就是接入微信SDK,不过,微信开放平台的文档写的不是很友好,这里我讲讲流程,希望可以帮助到有疑问的同学。(注:我手头上没有mac电脑,不方便测试,本文主要是讲解流程... 查看详情
unity接入优量汇(广点通|腾讯广告)(代码片段)
Unity接入优量汇(广点通|腾讯广告)下载地址:https://adnet.qq.com/resource/sdk如上图所示,unity版本跟Android版本是同一天更新。(效率这么高的嘛?)但是下载之后,遇到各种问题。没有清单没有gradle。摸索了一... 查看详情
unity接入自定义插件-调用安卓原生震动(代码片段)
前言:在网上看了好多接入安卓震动的例子,但是打包的时候总是会冲突,不是多个图标就是不能用等等,其实就是跟其他安卓插件冲突了。为了解决冲突问题,对于我这个安卓小白来说真是难啊,终于千辛万苦找到了一篇... 查看详情
unity接入北斗探针sdk(基于unityplayeractivity)丨四编写java代码,导出aar
文章目录 查看详情
unity接入多个sdk的通用接口开发与资源管理(代码片段)
接着上篇,介绍SDK资源的导入。首先介绍一下AndroidStudio工程。AS工程可以由多个Module组成,我们可以把某个Module作为我们打包的Module,其他的Module当做资源导入到主Module中。我们unity导出的Gradle工程(有一篇介绍了unity出Gradle工... 查看详情
qq互联网站应用接入
1.准备工作接入qq登陆前,网站需要先进行申请,获得对应的appid和appkey,以保证后续流程中可正确对网站与用户进行授权。2.放置qq登陆按钮。在网站页面上放置“qq登录”按钮,并为按钮添加前台代码,实现点击按钮即弹出qq... 查看详情
unity接入iap服务器验单(googleplay)(代码片段)
...集成了GooglePay、AppleAppStore的支付,Unity会根据不同的平台唤起相应的支付。1.安装IAP通过Unity自带的PackageManager安装Window>PackageManager打开后搜索InAppPurchasing安装2.关于IAP在Unity内的设置参考文档:链接:https://docs.unity3d.com/53... 查看详情
unity实战篇|接入声网sdk实现音频通话——自己动手做一个语音聊天房(代码片段)
目录🐱🏍前言🎂Unity接入声网SDK实现音频通话第1️⃣步,创建声网应用第2️⃣步,获取相应的SDK第3️⃣步,将SDK接入Unity中第4️⃣步:搭建一个测试场景,编写测试代码第5️⃣步:音频通... 查看详情