客户端接入指南


本文档面向 Android开发者,描述的接入方式适合运营在 4399 平台的普通单机游戏。

SDK 说明

功能描述

4399 运营 SDK,为单机类游戏提供防沉迷、数据统计、增量更新、有服务器/无服务器充值等功能

用户信息与隐私策略

SDK 中使用的用户信息及隐私策略参考:4399 通行证用户服务协议

SDK 组成

客户端 SDK

客户端支持的编译配置 android:minSdkVersion >= 16
从SDK 3.2.0开始,优先支持aar接入方式,发布结构遵循 Android Studio(as) 规范
若游戏只能以 jar+res 方式接入,请参考 jar+res 依赖引入

服务端 API

服务端支持额外的功能,参考 SDK 服务端接入文档

集成流程

准备

首次接入 SDK,要在 4399 开放平台 注册应用,主要是提交游戏包、游戏素材,配置游戏货币、充值回调地址等信息。
完成后,开发者将得到 SDK 的基础参数:game keyGameKey,游戏在 4399 平台的运营标识

引入依赖

repositories {
    maven {
        // 4399 SDK 开放仓库:正式
        url 'https://mvn.4399doc.com/repository/maven-releases'
    }
    maven {
        // 4399 SDK 开放仓库:快照
        url 'https://mvn.4399doc.com/repository/maven-snapshots'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    
    // 运营 SDK:建议使用最新版本,可通过浏览仓库地址或向运营咨询版本
    implementation "cn.m4399.sdk:operate:3.2.0"
    
    // volley 和 support 是 SDK 使用的外部依赖,若接入方已有,可忽略
    implementation 'com.android.volley:volley:1.2.0'
    //noinspection GradleCompatible
    implementation "com.android.support:support-v4:28.0.0"
}
operate/libs/volley-v1.2.0.jar
operate/libs/support-v13-23.2.1.jar

Gradle 文件中注意添加本地依赖

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
}

abi 适配与 so 库

若游戏不需要支持所有 abi ,可以按需选用

android {
    defaultConfig {
        ndk {
            // 根据游戏需要选择
            abiFilters "armeabi", "armeabi-v7a", "x86", "arm64-v8a"
        }
    }
}

jar+res依赖引入比较繁琐,但是完成后,后续接口调用仍然是一样的。

接口调用:初始化(必须)

SDK 初始化后才能正确调用其他接口,建议在游戏Activity的开始处如 onCreate方法中进行。

// 初始化选项,传入游戏配置,更多说明见接入文档
OperateConfig opeConfig = new OperateConfig.Builder(this)
        // 设置游戏运营 key,此参数需要在原创开放平台注册应用后得到
        .setGameKey(GAME_KEY)
        // 设置SDK页面方向,应与游戏方向一致,部分第三方页面需要在AndroidManifest中设置
        .setOrientation(GameSettings.SCREEN_ORIENTATION)
        // 设置游戏充值是否支持超出金额,true时支持,默认true
        // 也可以每次充值通过 OperateCenter.setSupportExcess 设置
        .setSupportExcess(true)
        // 设置游戏是否兼在高于Android 9.0版本系统容全面屏,默认不兼容
        .compatNotch(GameSettings.COMPACT_NOTCH)
        .build();

// 初始化SDK
SingleGame.init(this, opeConfig, new OpeInitedListener() {
    @Override
    public void onInitFinished() {
        // 完成防沉迷等初始化流程,可进入游戏
    }
});

接口调用:充值

单机游戏需要充值功能时,首先要确认是使用服务端回调模式,还是客户端模式。若是前者,只要在注册游戏时完成充值配置即可;若游戏没有自己的服务器,而不得不使用客户端回调,首先要注册回调对象。

注意,客户端回调模式不安全,APK 容易被静态破解

// 单机游戏充值时,允许使用客户端回调,如需使用请联系运营确认
// 注意 !!!!!:客户端回调不安全,APK 容易被篡改
// 设置发放物品回调,需要客户端回调才使用
SingleGame.setDeliveringGoodsListener(new SingleGame.OnDeliveringGoodsListener() {
    @Override
    public boolean onDelivering(OrderFinished of) {
        Log.i(TAG, of.money() + " " + of.conclude().first + " " + of.conclude().second);
        // 如果游戏因为某些原因发放失败,应返回false
        return true;
    }
});
/*
 * 充值
 *
 * activity,Activity对象,必须
 * money, 充值金额,整型,单位元,1 ~ 50000,必须
 * mark, 游戏方订单,必须,
 *      支持大小写字母、数字、'|'(竖线)、'-'(中划线)、'_'(下划线),最长32位,不可为空,不可重复
 * commodity, 商品名称,可选,最长8个字符
 */
String mark = GameSettings.createUniqueMark();
SingleGame.recharge(this,
        // 充值金额,整数,单位元
        // mark: 游戏订单,游戏可以再其中映射用户名、商品信息
        new Order(6, mark)
                // 是否支持超出金额,默认不支持
                .supportExcess(false)
                // 商品名,可选,不传时认为商品名是游戏币
                .commodity(getString(R.string.recharge_commodity_name)),
        new OperateCenter.OnRechargeFinishedListener() {
            @Override
            public void onRechargeFinished(boolean success, int resultCode, String msg) {
                Log.i(TAG, resultCode + " " + msg);
            }
        });

关于Order对象中的supportExcess(boolean)接口

关于超出金额模式(超额)
由于卡类等充值渠道有金额限制,可能出现充值金额无法匹配任何金额的情况;
如果游戏能处理超出传入金额 部分的货币,即将多余部分以游戏发放给用户,则可以设置true
否则,应设置为false或不调用,SDK将直接隐藏无匹配金额的充值渠道。

游戏更新

此功能需要在4399后台提交新版本,并开启相关开关,详情可咨询运营。 更新功能更会检查是否有新版本游戏上线,如果有,则显示更新内容、提示用户升级。

按升级内容,可为全量更新和增量更新(只需下载新旧版 APK 文件中的差异部分)。
按接入方式又可分为自动更新(无需操作,默认初始化完成)和自定义界面更新

自定义界面增量更新接入方法详见: 4399运营SDK增量升级说明