本文档面向 Android 开发者,描述的接入方式适合运营在 4399 平台的独代游戏。
SDK 中使用的用户信息及隐私政策参考:《4399通行证用户服务协议》 与《隐私政策》
为4399独家代理的游戏提供的SDK,提供游戏激活、礼包、更新等服务,和游戏官方消息官方活动、论坛等丰富而优质的游戏内容
若游戏有被静态修改后二次打包的情况,SDK 对此类破解提供了一些解决方案,详见 服务端文档
SDK 优先提供在线aar
依赖方式,Demo 结构遵循 Android
Studio(as) 规范,但仍然保留了 jar+res
的依赖方式。
SDK 支持的编译配置 android:minSdkVersion >= 16。
服务端支持额外的功能,参考 SDK 服务端接入文档
首次接入 SDK,要在 4399 开放平台
注册应用,主要是提交APK、素材等信息。
完成后,开发者将得到 SDK
的基础参数:game key
或GameKey
,游戏在 4399
平台的运营标识
根据游戏需要,以下三种方式可选其一
build.gradle
中引入以下内容即可{
repositories {
maven // 4399 SDK 开放仓库:正式
'https://mvn.4399doc.com/repository/maven-releases'
url }
{
maven // 4399 SDK 开放仓库:快照
'https://mvn.4399doc.com/repository/maven-snapshots'
url }
}
{
dependencies fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation
// 运营 SDK:建议使用最新版本,可通过浏览仓库地址或向运营咨询版本
"cn.m4399.sdk:operate:3.3.4"
implementation
// volley 和 support 是 SDK 使用的外部依赖,若接入方已有,可忽略
'com.android.volley:volley:1.2.0'
implementation //noinspection GradleCompatible
"com.android.support:support-v4:28.0.0"
implementation }
注意:若使用7.0+
版本的 gradle 及 android build
插件,仓库地址应配置在settings.gradle
中
operate/libs/volley-v1.2.0.jar
operate/libs/support-v13-23.2.1.jar
Gradle 文件中注意添加本地依赖
{
dependencies fileTree(dir: 'libs', include: ['*.jar','*.aar'])
implementation }
jar+res
依赖引入
比较繁琐,但是完成后,后续接口调用仍然是一样的。若游戏不需要支持所有 abi
,可以按需选用。
aar
依赖方式,按以下方式配置需要的abi
;jar+res
依赖方式需要手动删除不需要的abi
目录
android {
defaultConfig {
ndk {
// 根据游戏需要选择
abiFilters "armeabi", "armeabi-v7a", "x86", "arm64-v8a"
}
}
}
在游戏项目的AndroidManifest.xml
中,需要注册存储权限和渠道标识
<!-- 接入方应在调用接口前,申请好运行时权限 -->
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<
application ....>
<<!-- 渠道标记,4399官方渠道为‘4399’,其他渠道可与运营确认 -->
meta-data android:name="FTNN_CHANNEL_ID" android:value="4399"/>
<application> </
接入方应在调用接口前,申请好运行时权限,可以使用EasyPemissions 第三方类库快速处理
SDK
初始化后才能正确调用其他接口,建议在游戏Activity
的开始处如
onCreate
方法中进行。
此接口内部自动完成“更新、激活、防沉迷”等流程。
private void initSDK() {
@Override
protected void onCreate(Bundle savedInstanceState) {
// ....
// 初始化 SDK
// 配置全局属性,如横竖屏配置
= new OperateConfig.Builder(this)
OperateConfig operateConfig // 设置调试模式,可选,true时打开,默认false,发布前必须设置为false或删除该行
.setDebugEnabled(false)
// 设置游戏运营 key,此参数需要在原创开放平台注册应用后得到
.setGameKey(GAME_KEY)
// 设置SDK页面方向,应与游戏方向一致,部分第三方页面需要在AndroidManifest中设置
.setOrientation(GAME_ORIENTATION)
// 设置游戏是否兼在高于Android 9.0版本系统容全面屏,true兼容,默认false
.compatNotch(GAME_COMPACT_NOTCH)
.build();
.init(this, operateConfig, new ExclusiveAgent.OnInitGlobalListener() {
ExclusiveAgent/*
* 激活状态回调
*
* code 激活禁用 1:激活成功 2:已激活过
* msg 状态说明
*/
@Override
public void onActivationState(int code, @NonNull String msg) {
}
/*
* 初始化完成,玩家在此处可以安全进入游戏
*/
@Override
public void onInitFinished() {
}
});
}
}
初始化的几点说明
<!-- 游戏 Activity 配置建议:
应该使用 android:configChanges="orientation|screenSize|keyboardHidden"
不应该使用 android:launchMode="singleTask" 启动模式,可以考虑 singleTop
-->
OperateConfig.setOrientation()
接口设置 SDK
页面方向android.content.pm.ActivityInfo
定义的常量方向参数 | 含义 |
---|---|
SCREEN_ORIENTATION_LANDSCAPE ,int , 0 |
横屏 |
SCREEN_ORIENTATION_PORTRAIT , int , 1 |
竖屏 |
SCREEN_ORIENTATION_SENSOR_LANDSCAPE ,int ,
6 |
横屏,可180度旋转 |
SCREEN_ORIENTATION_SENSOR_PORTRAIT ,int ,
7 |
竖屏 |
初始化之后,可以调用游戏盒跳转接口,这些接口可以大大丰富游戏内容、补充游戏功能。
/*
使用活动码
your_activity_id: 活动ID,向运营获取
your_activity_code: 活动码,用户输入
*/
.useActivityCode("your_activity_id",
ExclusiveAgent"your_activity_code",
new OpeResultListener() {
@Override
public void onResult(int code, @Nullable String message) {
// code 0:成功 3:失败 5:异常中止
}
});
/*
使用礼包码
your_gift_id: 礼包ID,向运营获取
your_gift_code: 礼包码,用户输入
*/
.useGiftCode("your_gift_id",
ExclusiveAgent"your_gift_code",
new OpeResultListener() {
@Override
public void onResult(int code, @Nullable String message) {
// code 0:成功 3:失败 5:异常中止
}
});
原有的游戏盒跳转,即礼包、活动、论坛、游戏盒详情接口,迁移为通用跳转接口,开发需要向运营获取跳转参数,跳转方式参考下文通用跳转接口
游戏可能需要更多形式、更灵活配置跳转,为此 SDK 对此进行支持。使用这一特性需要:
// 先判断是否支持key的协议
.support(key, new OpeResultListener() {
OperateAction@Override
public void onResult(int code, @Nullable String msg) {
// 使用key进行跳转,0为支持,其他不支持
if (code == 0) {
.perform(key);
OperateAction}
}
});
极少数跳转需要传递额外参数,如图片分享,此时要使用另一个接口
// 入口 key
// 跳转intent,intent的内部是键值对
.perform(key, intent); OperateAction