Appearance
Android端接入指引
环境配置
1.targetSdk版本
当targetSdk版本为28以上时,http请求可能会失败,需要在AndroidManifest的application节点下添加以下属性:
xml
<application android:usesCleartextTraffic="true"></application>2.横竖屏配置
根据游戏的横竖屏,需要对游戏做横竖屏screenOrientation配置,同时还需要设置游戏activityconfigChanges属性为orientation|screenSize,保证屏幕发生变化时游戏activity不会重新创建,如下所示:
xml
<activity
android:name="游戏Activity"
android:configChanges="orientation|screenSize"
android:screenOrientation="sensorPortrait" />3.使用aar进行接入
导入nutgameqsdk-x.x.x.aar文件以及其相关依赖到项目的libs目录,在项目主模块(:app)的build.gradle文件dependencies项导入,如下所示:
groovy
// 坚果SDK(x.x.x对应相应版本号)
implementation files('libs/nutgameqsdk-x.x.x.aar')
// 坚果SDK依赖(注意区分Android和AndroidX项目)
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
// 支付宝、微信支付依赖
api 'com.alipay.sdk:alipaysdk-android:+@aar'
api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
// 其他依赖
implementation files('libs/ALP-crashshield-2.0.3-release.jar')
implementation files('libs/ALP-logger-2.0.3-release.jar')
implementation files('libs/ALP-main-2.0.3-release.jar')
implementation files('libs/ALP-phoneNumber-L-AuthSDK-2.12.1.jar')
implementation files('libs/ALP-r-classes.jar')
implementation files('libs/alpha-asst.aar')
implementation files('libs/com.quickjoy.lib_v2017101601_proguard.jar')
implementation files('libs/converter-gson-2.9.0.jar')
implementation files('libs/fastjson-1.2.60.jar')
implementation files('libs/gson-2.8.6.jar')
implementation files('libs/HumeSDK-1.1.1.aar')
implementation files('libs/okhttp-4.7.2.jar')
implementation files('libs/okio-2.6.0.jar')
implementation files('libs/open_sdk_3.5.17.3_r75955a58_lite.jar')
implementation files('libs/picture_library-release.aar')
implementation files('libs/quickcostum-release.aar')
implementation files('libs/uk-co-senab-photoview-source.jar')
implementation files('libs/walle-cli-all.jar')4.Icon角标
游戏的icon需要在右下角加入坚果游戏角标,素材可在角标素材文件夹中找到。
接入流程
1.添加闪屏(必接)
游戏需接入坚果游戏闪屏(自行创建闪屏Activity并安排位置),创建的闪屏Activity需继承自NutGameSplashActivity,同时需覆写onSplashStop方法,填入闪屏结束后要跳转的逻辑即可。
java
@Override
public class SplashActivity extends NutGameSplashActivity {
@Override
public void onSplashStop() {
// 默认闪屏显示3秒,结束后跳转到游戏界面
startActivity(new Intent(SplashActivity.this, GameActivity.class));
finish();
}
}将创建的闪屏Activity添加到AndroidManifest.xml中,并设置为游戏启动Activity。
xml
<activity
android:name="com.xxx.SplashActivity"
android:screenOrientation="竖屏|横屏"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>注意:android:screenOrientation属性,其值根据游戏横竖屏情况决定。
2.回调通知
2.1.初始化回调(必接)
设置SDK初始化回调通知,SDK初始化成功后,就可以调用SDK登录等其它相关操作。
java
NutSdk.getInstance().setInitCallback(new InitCallback() {
@Override
public void onSuccess() {
// 初始化完成,调用SDK登录
}
@Override
public void onFailed(String msg) {
// 初始化失败
Log.d("nutgame", "initSDK onFailed: " + msg);
}
})2.2.登录回调(必接)
设置SDK登陆回调通知,登录成功后即可得到当前小号的信息,进行游戏登陆等相关处理。
java
NutSdk.getInstance().setLoginCallback(new LoginCallback() {
@Override
public void onSuccess(UserInfo userInfo) {
// 登录成功,获取当前小号的UID、UserName、Token
Log.d("nutgame","Login onSuccess: " + userInfo.getUid());
}
@Override
public void onFailed(String msg) {
// 登录失败后的操作
Log.d("nutgame", "Login onFailed: " + msg);
}
})登录返回字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| UID | String | 用户ID,用户的唯一标识 |
| UserName | String | 用户登录名 |
| Token | String | 用户验证token |
登录顺序图:
sequenceDiagram
autonumber
坚果SDK->>坚果服务器: 发起小号登录请求
坚果服务器->>坚果SDK: 返回小号的uid、token
坚果SDK->>游戏客户端: 提供小号uid、token用于登录游戏
游戏客户端-->>游戏服务器: 提交小号uid、token去登录
游戏服务器-->>坚果服务器: 验证小号uid、token有效性
坚果服务器->>游戏服务器: 返回验证结果
游戏服务器-->>游戏客户端: 返回登录结果
2.3.登出回调(必接)
设置SDK登出回调通知,SDK登出后游戏应同步登出。
java
NutSdk.getInstance().setLogoutCallback(new LogoutCallback() {
@Override
public void onSuccess() {
// SDK已登出,处理游戏登出
}
})2.4.支付回调(必接)
设置SDK支付回调通知,支付完成后,可以在支付回调中拿到支付结果(以服务端通知为准,客户端支付回调仅作为参考)。
java
NutSdk.getInstance().setPayCallback(new PayCallback() {
@Override
public void onSuccess() {
// 支付成功
Log.d("nutgame", "pay onSuccess");
}
@Override
public void onFailed(String msg) {
// 支付失败
Log.d("nutgame", "pay onFailed: " + msg);
}
})支付顺序图:
sequenceDiagram
autonumber
actor 玩家
玩家-->>游戏客户端: 点击购买道具
游戏客户端-->>游戏服务器: 提交购买道具请求
游戏服务器-->>游戏客户端: 创建订单,返回订单号
游戏客户端-->>坚果SDK: 调用支付接口,传入订单信息
坚果SDK->>坚果服务器: 发起支付流程
坚果服务器->>游戏服务器: 发送支付结果通知
游戏服务器-->>游戏客户端: 发放道具
游戏服务器-->>坚果SDK: 返回发放道具结果
游戏客户端-->>玩家: 获得道具
2.5.退出游戏(必接)
设置退出游戏回调通知,玩家点击了确定退出后,再执行退出游戏操作。
java
NutSdk.getInstance().setExitCallback(new ExitCallback() {
@Override
public void onSuccess() {
// 执行游戏退出逻辑...
finish();
}
@Override
public void onFailed(String s) {
// 失败函数忽略即可
}
});3.初始化(必接)
需要在游戏Activity的onCreate方法中执行(产品号由负责对接的运营提供)。
java
NutManager.init(GameActivity.this, "产品号(productCode)");4.登录(必接)
调用SDK登录,拉起SDK登录弹窗。
java
NutManager.login(GameActivity.this);5.登出(必接)
调用SDK登出,可在登出账号回调中做相应的处理。
java
NutManager.logout(GameActivity.this);6.上报角色(必接)
玩家进入游戏后,就需要立即对当前角色的信息进行上报,请务必保证角色信息的准确性,之后每当用户的角色信息改变时就需要执行角色信息的上报操作。
java
QGRoleInfo qgRoleInfo = new QGRoleInfo();
// 上报的角色信息对象的属性均为必填
qgRoleInfo.setRoleId("100100");
qgRoleInfo.setRoleName("沙巴克杀手");
qgRoleInfo.setRoleLevel("100");
qgRoleInfo.setRolePower("13600");
qgRoleInfo.setBalance("50000");
qgRoleInfo.setVipLevel("20");
qgRoleInfo.setPartyName("玛法家园");
qgRoleInfo.setServerId("1");
qgRoleInfo.setServerName("沙巴克一区");
// 上报角色
NutManager.setGameRoleInfo(GameActivity.this, qgRoleInfo);QGRoleInfo 角色信息类
| 字段名 | 类型 | 说明 |
|---|---|---|
| roleid | String | 游戏角色id(必填) |
| rolename | String | 游戏角色名字(必填) |
| rolelevel | String | 游戏角色等级(必填) |
| rolepower | String | 游戏角色战斗力(必填) |
| balance | String | 游戏币余额,默认填写0(必填) |
| viplevel | String | vip等级(必填) |
| partyname | String | 工会、帮会,默认填写空字符串(必填) |
| serverId | String | 服务器id(必填) |
| servername | String | 服务器名称(必填) |
7.支付(必接)
调起SDK支付页面,请务必保证订单信息的准确性,可在支付回调中接收支付结果。
java
// 角色信息
QGRoleInfo qgRoleInfo = new QGRoleInfo();
qgRoleInfo.setRoleId(QGManager.getGameRoleInfo().getRoleId()); //必传
qgRoleInfo.setRoleName(QGManager.getGameRoleInfo().getRoleName()); //必传
qgRoleInfo.setRoleLevel("100");
qgRoleInfo.setRolePower("13600");
qgRoleInfo.setBalance("50000");
qgRoleInfo.setVipLevel("20");
qgRoleInfo.setPartyName("玛法家园");
qgRoleInfo.setServerId("1"); //必传
qgRoleInfo.setServerName("沙巴克一区"); //必传
// 订单信息
QGOrderInfo qgOrderInfo = new QGOrderInfo();
qgOrderInfo.setAmount(amount); //必传
qgOrderInfo.setCount(1); //必传
qgOrderInfo.setPayParam("2000"); // 商品描述
qgOrderInfo.setOrderSubject("麻痹戒指"); // 商品名称
qgOrderInfo.setProductOrderId("18140560201541"); //订单ID 必传
qgOrderInfo.setExtrasParams(""); //透传参数
// 调起SDK支付页面
NutManager.pay(GameActivity.this, qgRoleInfo, qgOrderInfo);QGOrderInfo订单信息类
| 字段名 | 类型 | 说明 |
|---|---|---|
| amount | String | 订单金额(元) |
| count | int | 商品数量 |
| payparam | String | 商品描述 |
| ordersubject | String | 商品名称 |
| productorderid | String | 订单号 |
| extrasparams | String | 透传参数 |
8.生命周期方法(必接)
为了保证SDK正常运行,需要在游戏Activity的生命周期方法中执行SDK的方法
java
@Override
protected void onResume() {
super.onResume();
if (!TextUtils.isEmpty(QGManager.getUID())) {
QGManager.showFloat(true);
}
}
@Override
protected void onPause() {
super.onPause();
QGManager.hideFloat();
}9.退出游戏(必接)
玩家按下返回键退出游戏时,需要执行SDK提供的退出游戏方法,此方法会弹出Dialog挽留用户。
在游戏Activity中覆写onKeyDown方法,如下所示:
java
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 用户按下返回键退出游戏
NutManager.exit(GameActivity.this);
return true;
}
return super.onKeyDown(keyCode, event);
}防沉迷相关
SDK自带防沉迷系统,会自动弹出防沉迷窗口,包含实名认证、未成年登录限制、充值限制,开发者无需再做处理。
1.获取年龄
返回值int类型,如果未实名则返回0。
java
NutManager.getAge();2.获取实名认证与否
java
NutManager.getRealName();