更新日期:2024年 06月 06日QuickGame(安卓)客户端接入文档
<h3>
<span style="font-size:16px;">一、 资源导入</span>
</h3>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">1.1. 前期准备</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">由于SDK内部使用了 oaid-2.1.0 以上版本,所以CP需要提前到移动安全联盟注册账号以及申请对应的参数文件</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">步骤:</span>
</p>
<p>
<span style="font-size:14px;">a. 到移动安全联盟官网注册账号并审核通过 </span><a href="http://www.msa-alliance.cn/" target="_blank" style="font-size:14px;">http://www.msa-alliance.cn/</a>
</p>
<p>
<span style="font-size:14px;">b. 账号审核通过后,下载OAID的SDK,找到里面的 csv 文件,填写好游戏包名等信息,然后附邮件<span style="white-space:normal;font-size:14px;">发送</span>到 msa@caict.ac.cn 获取对应的证书文件<span style="color:#E53333;">(证书文件有效期为1年,请注意及时更换)</span></span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/202305181420262BqX136.png" alt="" /><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">c. 将得到的包名.cert.pem 文件,复制到游戏工程 assets 目录下</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<br />
<h4>
<span style="font-size:14px;">1.2. 复制资源</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;color:#E53333;"><span style="white-space:normal;font-size:14px;">依次复制以下资源到您的项目中,</span>包含 assets、libs、res、manifest.xml 里面的资源</span>
</p>
<p>
<span style="font-size:14px;color:#E53333;"><span style="white-space:normal;font-size:14px;color:#E53333;">资源复制进去后,切记修改 manifest 里面部分包名占位符,以及预</span><span style="white-space:normal;font-size:14px;color:#E53333;">设授权登录方式的参数,如不使用授权登录,则保留数默参数 QK0</span></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/20230518142251aplz387.png" alt="" /><br />
</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">1.3. 添加依赖</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">在项目或 module 的 build.gradle 添加以下依赖(<span style="color:#E53333;">版本只能高不能低</span>)</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
implementation 'androidx.appcompat:appcompat:1.2.0'
//taptap
implementation 'cn.leancloud:storage-android:8.2.18'
implementation 'cn.leancloud:realtime-android:8.2.18'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'androidx.core:core:1.6.0'
implementation 'com.google.android.flexbox:flexbox:3.0.0'
//api project(path: ':oaid_1_0_25')
api 'com.tencent.vasdolly:helper:3.0.4'</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<br />
<h3>
<span style="font-size:16px;">二、接入描述</span>
</h3>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.1. 调用隐私协议接口</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">QGManager.showPrivace(MainActivity.this, new QGCallBack() {
@Override
public void onSuccess() {
//下一步游戏申请读写内存和读取设备信息权限,申请完成之后初始化
sdk
}
@Override
public void onFailed(String msg) {
// 玩家拒绝协议,游戏执行退出游戏操作
}
});</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;color:#E53333;">注意:</span>
</p>
<p>
<span style="font-size:14px;"><span style="color:#E53333;">1. 游戏</span><span style="color:#E53333;">首次启动的时候要主动调用一次,如果玩家同意了协议,游戏需在本地做个标记,下一次启动时就不再弹出;如果玩家拒绝,那么下次启动还是需要继续弹出,直到玩家允许为止</span></span>
</p>
<p>
<span style="font-size:14px;"><span style="color:#E53333;">2. 使用这个接口所展示的协议弹窗,需要在 </span><span style="color:#E53333;">manifest </span><span style="color:#E53333;">内配置隐私协议地址和用户协议地址,</span></span><span style="font-size:14px;color:#E53333;">否则协议标志点击无效果</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/202305181425531ky8765.png" alt="" /><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2.1.1 设置注销账号回调</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">QGManager.setLogoutCallback(new QGCallBack() {
@Override
public void onSuccess() {
Toast.makeText(mActivity, "注销成功", Toast.LENGTH_SHORT).show();
//隐藏浮窗
QGManager.hideFloat();
}
@Override
public void onFailed(String msg) {
Toast.makeText(mActivity, "注销失败", Toast.LENGTH_SHORT).show();
}
});</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.2. 初始化 </span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;color:#E53333;">注意,一共有两个接口需要调用</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QGManager .initMsa (Application application );// 此接口需要在Application的onCreate之中调用,以便于获取 OAID;</pre>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">/init接口,在主Activty的onCreate中执行或申请权限的回调内执行
QGManager.init(MainActivity.this, "产品号(product_code)", new QGCallBack() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(String msg) {
}
});</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.3. 登录</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QGManager.login(MainActivity.this, new QGCallBack() {
@Override
public void onSuccess() {
QGManager.getUID();//获取 UID
QGManager.getUserName();//获取 UserName
QGManager.getLoginToken();//获取 Token
}
@Override
public void onFailed(String msg) {
}
});</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2.3.1. 静默登录</strong><strong> (不显示登录界面,默认生成账号)</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">QGManager. slienceLogin (MainActivity.this, new QGCallBack() {
@Override
public void onSuccess() {
QGManager.getUID();//获取 UID
QGManager.getUserName();//获取 UserName
QGManager.getLoginToken();//获取 Token
}
@Override
public void onFailed(String msg) {
}
});
</pre>
<br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2.3.2. </strong></span><span style="font-size:14px;"><strong> 获取登录方式</strong></span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">/**
* 获取登录方式 仅在第一次选择时生效 建议游戏做 uid 绑定 防止后续获取到的都是
**自动登录
* 自动登录 0
* 账号登录 1
* 验证码登录 2
* qq 4
* 微信 5
* 阿里云一键授权 6
* taptap 7
*/
QGManager.getLoginType();</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.4. 设置角色信息</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QGRoleInfo roleInfo = new QGRoleInfo();
roleInfo.setBalance("9999");
roleInfo.setPartyName("天地");
roleInfo.setRoleId("10086");
roleInfo.setRoleName("白富美");
roleInfo.setServerName("888");
roleInfo.setVipLevel("999");
roleInfo.setRoleLevel("999");//等级
roleInfo. setRolePower ("999");//战斗力
QGManager.setGameRoleInfo(MainActivity.this, roleInfo);</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.5. 支付</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QGOrderInfo mOrderInfo = new QGOrderInfo();
QGRoleInfo mRoleInfo = new QGRoleInfo();
//角色信息
mRoleInfo.setRoleId("123546421321");
mRoleInfo.setRoleLevel("1");
mRoleInfo.setRoleName("hhaha");
mRoleInfo.setServerName("zzz");
mRoleInfo.setVipLevel("666");
// 订单信息
mOrderInfo.setAmount("0.01");
mOrderInfo.setCount(1); //数量
mOrderInfo.setExtrasParams("2017110403"); //透传参数
mOrderInfo.setPayParam("eedwd");// 商品描述
mOrderInfo.setOrderSubject("钻石"); // 商品名称
mOrderInfo.setProductOrderId("2017110403");//cp 订单号
QGManager.pay(MainActivity.this, mRoleInfo, mOrderInfo, new QGCallBack() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(String msg) {
}
});</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2.5.1 统计支付信息</strong><strong>(非必接)</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">//游戏确认到账发货时调用
QGManager.adPayStatistics(QGManager.getUID(),
QGManager.getUserName(), "角色 id", "订单号", "商品 id", "商品名称", 总
价, 货币);</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.6. 注销</span>
</h4>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">QGManager.logout(MainActivity.this);</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.7. 生命周期</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">@Override
protected void onPause() {
super.onPause();
QGManager.hideFloat();
}
@Override
protected void onResume() {
super.onResume();
if (!TextUtils.isEmpty(QGManager.getUID())) {
QGManager.showFloat();
}
}</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.8. 退出</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QGManager.exit(MainActivity .this, new QGCallBack() {
@Override
public void onSuccess() {
finish();
}
@Override
public void onFailed(String msg) {
}
});</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.9. 显示/ 隐藏浮窗</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QGManager.showFloat(true/false); //true: 浮窗默认倚靠屏幕左边
QGManager.hideFloat();</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.10. 拓展登录方式 授权相关</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2.10.1. 开启QQ授权登录</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">请修改 manifest 配置中的以下 2 处的QQ参数:</span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/20230518145918T7Px998.png" alt="" /><br />
</span>
</p>
<p>
<span style="font-size:14px;color:#E53333;">注意:meta-data 的 value 格式为 android:value="QK+QQ</span><span style="font-size:14px;color:#E53333;">的appid"</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<br />
<p>
<span style="font-size:14px;"><strong>2.10.2. 开启微信授权登录</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">如果游戏需要使用微信登录,需要将参数配置到manifest文件中的指定位置,并</span><span style="font-size:14px;">新建一个WXEntryActivity类,继承QGWXEntryActivity类,放到<span style="white-space:normal;font-size:14px;">包名</span>.wxapi路径下(例如com.xxx.xxx.wxapi.WXEntryActivity),然后</span><span style="font-size:14px;">在</span><span style="font-size:14px;">manifest中注册该Activity;此处可参照demo处理;如果不使用,则保持默认的0</span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/202305181501010JMi463.png" alt="" /><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/20230518150112rZzk235.png" alt="" /><br />
</span>
</p>
<p>
<span style="color:#E53333;font-size:14px;">注意:meta-data 的 value 格式为 android:value="QK+微信的 appid 或 appkey"</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2.10.3. 获取微信/QQ 的OpenID</strong> </span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">public void getExtUserInfo() {
String openId = QGManager.getExtInfo().getOauthId(); // 获取微信/qq 的 openId
int openType = QGManager.getExtInfo().getOauthType(); // openType: 4 是微信
// 5 是 qq
}</pre>
<br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2.10.4. 阿里云手机号一键授权登录</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">修改 manifest 中的阿里云的参数</span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/202305181502311D4F552.png" alt="" /><br />
</span>
</p>
<p>
<span style="color:#E53333;font-size:14px;">注意:</span>
</p>
<p>
<span style="font-size:14px;"><span style="color:#E53333;">1. meta-data 的 value 格式为 android:value="QK+游戏的阿里云参数"(</span><span style="color:#E53333;">ps:阿里云此处</span></span><span style="font-size:14px;"><span style="color:#E53333;">的 key 长度非常长,最少128 位以上</span><span style="color:#E53333;">),并且要保证游戏的包名以及签名要跟阿里云后台申请产品时,</span></span><span style="font-size:14px;color:#E53333;">所填入的信息一致。 测试时请保证插入了 sim 卡并且打开了移动网络</span>
</p>
<p>
<span style="font-size:14px;"><span style="color:#E53333;">2. </span><span style="color:#E53333;">此处设置之后,还需要将阿里云后台的appid配置到,SDK后台-拓展配置-手机号一键登录处</span></span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/20230518150318X7KD486.png" alt="" /><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<br />
<p>
<span style="font-size:14px;"><strong>2.10.5. TapTap授权登录</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">修改manifest里,TapTap登录的参数</span>
</p>
<p>
<span style="font-size:14px;"><img src="https://staticsite.quickapi.net/data/newFiles/20230518/20230518152042qDkq472.png" alt="" /><br />
</span>
</p>
<p>
<span style="color:#E53333;font-size:14px;">注意:meta-data 的 value 格式为 android:value="QK+游戏的 appid 或 appkey"</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;">2.11. 防沉迷相关</span>
</h4>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<span style="font-size:14px;">SDK 自带防沉迷系统,会自动弹出防沉迷窗口,包含实名认证、未成</span><span style="font-size:14px;">年登录限制和充值限制,详情请参考<span style="white-space:normal;color:#2B2C30;font-family:微软雅黑, "font-size:32px;font-weight:600;background-color:#FFFFFF;"><a href="https://www.quicksdk.com/doc-934.html" target="_blank">QuickGame后台操作指南</a></span></span><br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">获取玩家实名年龄接口:</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">QGManager.getAge(); // 返回 int 值,如果未实名则返回 0 ;</pre>
<br />
<p>
<span style="font-size:14px;">获取是否实名认证: </span>
</p>
<pre class="brush:js;toolbar:false">QGManager.getRealName() ;</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">2.12 头条巨量与快手买量调试</span>
</h4>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">如果游戏需要上头条或者快手买量,需要在manifest里配置下头条/快手的参数(<span style="white-space:normal;font-size:14px;">将QK后续的字段替换为对应买量SDK的参数</span><span style="white-space:normal;font-size:14px;"></span>)</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20240606/20240606102951vX9F726.png" alt="" />
</p>
<p>
<br />
</p>
<p style="white-space:normal;">
<span style="color:#E53333;font-size:14px;">注意:meta-data 的 value 格式为 android:value="QK+头条/快手的appid 或 QK+自定义channelName",channelName的值游戏自行定义</span>
</p>
<div>
<br />
</div>
<p>
<br />
</p>
<p>
<br />
</p>
<h4>
<span style="font-size:14px;">2.13 盒子归因</span>
</h4>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">如想使用盒子的分包标识,请在打包时进行以下操作:</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">1. 通过聚合工具出包</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">在<a href="https://www.quicksdk.com" target="_blank"><u>QuickSDK后台</u></a>,添加自定义参数 <span style="color:#E53333;">gamebox_Package</span> ,参数值配置为游戏盒子的包名,一定要填写正确的盒子包名,然后保存参数重新打包</span><br />
<img src="https://staticsite.quickapi.net/data/newFiles/20240606/20240606102307zhwz641.png" alt="" />
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20240606/20240606102414RjoN539.png" alt="" />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">2. 直接接入</span><span style="font-size:14px;">QuickGameSDK</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">请在游戏工程内配置如下meta-data</span>
</p>
<p>
<br />
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20240606/202406061027332LZq867.png" alt="" /><br />
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">v</span><span style="font-size:14px;">alue的值为QK+游戏盒子的包名,</span><span style="font-size:14px;">例如QKcom.test.gamebox</span><br />
<span style="font-size:14px;"></span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false"><meta-data
android:name="QGGAMEBOX_PACKAGE"
android:value="QKcom.test.gamebox" /></pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<div style="white-space:nowrap;">
<br />
</div>
<p>
<br />
</p>