聚合渠道SDK-Android(Java)

SDK合规指南

聚合渠道SDK合规指南

1 文档修订记录

文档版本 文档更新日期 文档更新内容
3.3.57 2024.06.03 1.新增「4.13 广告追踪数据获取」接口
3.3.56 2024.05.10 1 新增SDK合规指南;2.可选个人信息的配置。
3.3.51 2024.03.05 1.新增「4.12 广告监测上报」接口
3.3.50 2023.11.24 1.「2.6 添加Activity」新增 service 和 provider配置
3.3.42 2022.10.12 1.「2.6 添加Activity」新增 FYCombineUseCenterActivity 配置,请将其添加到工程 AndroidMenifest.xml;2.「4.4 支付」新增notifyURL参数
3.3.30 2021.11.18 从聚合SDK独立拆分

2 接入准备

支持 Android Studio 接入

2.1 导入SDK

打开下载好的 FYBase、FYCombine 目录,拷贝目录中所有 .aar 到工程的 libs 目录中

2.2 配置 gradle

打开工程的 build.gradle

  • 拷贝以下代码到 android 字段下。
repositories {
    flatDir {
        dirs 'libs'
    }
}
  • 拷贝以下代码到 dependencies 字段下。
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
fileTree(dir: 'libs', include: ['*.aar']).each { file ->
    api(name: file.name.lastIndexOf('.').with {
        it != -1 ? file.name[0..<it] : file.name
    }, ext: 'aar')
}

2.3 添加SDK配置

1.到星云平台的"对接中心->SDK对接->SDK列表->基础接入参数->SDK配置参数"下载如下的配置文件:

配置参数

  • Android SDK 配置文件:FYCoreConfig.xml

2.打开以上的配置文件,拷贝所有meta-data配置参数到游戏的 AndroidManifest.xml 中的application标签下

3.可选个人信息的配置。如不希望本SDK采集某信息,请将对应字段的值改为0。如允许本SDK采集某信息,请将对应字段的值改为1

(1)在AndroidManifest.xml 中添加如下配置

<meta-data android:name="FY_GAME_PRIVACY" android:value="{
   "android_id ": "0",
   "basic_device_data" : "0",
   "os_version" : "0",
   "network_state" : "0"
}"/>

(2)字段名称说明

OS 个人信息类型及字段 用途和目的 是否可选 关闭方式
Android 设备基础信息(设备型号、硬件信息、屏幕分辨率) 帮用户排查异常时使用,作为异常分析的依据 修改配置参数 FY_GAME_PRIVACYbasic_device_data 字段值为"0"
Android Android ID 帮用户排查异常时使用,作为异常分析的依据 修改配置参数 FY_GAME_PRIVACY 的 android_id 字段值为"0"
Android 操作系统版本 帮用户排查异常时使用,作为异常分析的依据 修改配置参数 FY_GAME_PRIVACY 的 os_version 字段值为"0"
Android 网络状态 帮用户排查异常时使用,作为异常分析的依据 修改配置参数 FY_GAME_PRIVACY 的 network_state 字段值为"0"
Android OAID(版本3.3.56已去除) 帮用户排查异常时使用,作为异常分析的依据
Android MAC(版本3.3.56已去除) 帮用户排查异常时使用,作为异常分析的依据
Android IMEI(版本3.3.56已去除) 帮用户排查异常时使用,作为异常分析的依据

2.4 配置 Application

1、在游戏包名下新增一个 GameApplication 类,该类继承自 Application,请在GameApplication 类的 onCreate 方法中调用以下代码:

FYCombine.getInstance().doApplicationOnCreate();

请在GameApplication类的 attachBaseContext 方法中调用以下代码:

FYAPP.getInstance().init(this);
FYCombine.getInstance().doApplicationAttachBaseContext(base);

图片

打开 AndroidManifest.xml 在 application 将其继承于 GameApplication:

图片

2.如果游戏已经继承于其他 Application,请在游戏自定义的 Application 类的 onCreate 方法中调用以下代码:

FYCombine.getInstance().doApplicationOnCreate();

请在游戏自定义的 Application 类的 attachBaseContext 方法中调用以下代码:

FYAPP.getInstance().init(this);
FYCombine.getInstance().doApplicationAttachBaseContext(base);

3.以上2个步骤任选1个接入,否则会造成 SDK 错误闪退

2.5 添加权限

打开 AndroidManifest.xml 添加如下权限配置:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2.6 添加Activity

1.在 AndroidManifest.xml 中的 添加 Activity、service 和 provider

<activity
    android:name="com.feiyu.sandbox.platform.activity.FYSPUserCenterActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />

<activity
    android:name="com.feiyu.sandbox.platform.activity.FYSPRealNameActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />

<activity
    android:name="com.stars.debuger.activity.FYDebuggerInfoActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:windowSoftInputMode="adjustResize|stateHidden" />

<activity
    android:name="com.stars.combine.activity.FYCombineUseCenterActivity"
    android:configChanges="orientation|screenSize|keyboardHidden|keyboard|touchscreen"
    android:screenOrientation="behind"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:windowSoftInputMode="adjustPan|stateHidden" />

<service
    android:name="com.stars.core.download.service.DownloadService"
    android:exported="true"></service>

<provider
    android:name="com.stars.core.utils.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/fy_file_paths" />
</provider>

2.7 添加类引用

import com.stars.core.base.FYAPP;
import com.stars.combine.model.FYCombineInitInfo;
import com.stars.combine.model.FYCombinePayInfo;
import com.stars.combine.model.FYCombineUserCenterInfo;
import com.stars.combine.FYCombine;

2.8 添加 Activity生命周期方法

1、说明

  • 调用点:onKeyDown生命周期

2、调用代码

 FYDebugger.getInstance().onKeyDown(keyCode,event);

3、参考范例

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    FYDebugger.getInstance().onKeyDown(keyCode,event);
    return super.onKeyDown(keyCode, event);
}

2.9 开启调试模式

1.将 AndroidManifest.xml 中的 FY_GAME_DEBUG 的值改为 1,即可开启「调试模式」;FY_GAME_DEBUG 改为 0,即关闭「调试模式」。

2.开启「调试模式」会显示客户端的悬浮球,点击进入调试工具可以查看接口/回调的调用信息,具体调试方法可查看文档

悬浮球

3 界面跳转标准规范

为了您能快速接入,并避免大多数对接问题,请按照标准规范来对接。

3.1 登录流程

登录流程

3.2 首屏-切换账号流程

首屏-切换账号流程

3.3 游戏中-切换账号流程

游戏中-切换账号流程

4 客户端接口

接口接入的要诀?

  • 必接接口一定要接入,选接接口根据需要接入

  • 必传参数一定要传,能传的参数尽量都传

  • 所有的生命周期接口一定要接入

4.1 初始化(必接)

1.说明

  • 游戏需要在刚启动游戏的时候调用

  • 此接口在执行以后,会调用相应的回调方法,可以在回调方法中,处理相应的游戏逻辑

2.调用

FYCombine.FYCombineCallback callback = new FYCombine.FYCombineCallback() {
    // 初始化回调
    // 游戏应在确保收到此回调后才能调用聚合渠道模块的其他接口
    // 游戏不需管是否初始化成功,只要关心有没有收到初始化回调即可,也不需要重新调用初始化,SDK内部自己会处理初始化失败的情况
    @Override
    public void initCallback(FYCombineResponse response) {
        // TODO: 初始化完成
    }

    // 登录回调
    // 收到此回调的「登录成功」时,需将登录参数传到游戏服务器,再请求聚合服务端做登录校验,校验成功才算登录成功,具体校验方式请看「服务端接入文档」https://help.737.com/archives/docs/detail/channel_combine/sdk/server
    // 游戏收到此回调的「登录取消」或「登录失败」时,需向用户提供再次登录的按钮,以便用户能重新登录
    // 假如在游戏中收到此回调,并且 open_id 变了,此时需要退出到登录首屏,切换成另外一个角色,并重新进入游戏
    // 关于identityBirthday、identityAge这两个参数的使用,因不同渠道给到聚合的可能是生日也可能是年龄,所以若需使用这2个值,需对这2个值共同进行判断,如果identityAge有值就使用identityAge,如果没有就解析identityBirthday
    @Override
    public void loginCallback(FYCombineResponse response) {
        if (response.getStatus() == FYCombineResponse.SUCCESS) {
            // 游戏维度唯一用户ID
            String openId = (String) response.getDataValue("open_id");
            // 登录校验码,有效时间 7天,请在有效时间内完成校验,如超出时间需重新调用登录接口获取新校验码
            String token = (String) response.getDataValue("token");
            // 第三方用户ID
            String userId= (String) response.getDataValue("user_id");
            // 全渠道唯一用户ID
            String unionId= (String) response.getDataValue("union_id");
            // 渠道ID
            String channelId = (String) response.getDataValue("channel_id");
            // 身份证生日,格式:"1991-12-31"(有可能空)
            String identityBirthday = (String) response.getDataValue("identity_birthday");
            // 身份证年龄(有可能空)
            String identityAge = (String) response.getDataValue("identity_age");
            // 支付标识
            String paymentCode = (String) response.getDataValue("payment_code");
            // 通行证标识
            String passportCode = (String) response.getDataValue("passport_code");
            // TODO: 登录成功
            // TODO: 请求游戏服务端验证登录
        } else if (response.getStatus() == FYCombineResponse.LOGIN_CANCEL) {
            // TODO: 登录取消
        } else {
            // TODO: 登录失败
            // 失败原因
            String message = response.getMessage();
        }
    }

    // 登出回调
    // 当游戏调用 doLogout接口,本SDK会触发此回调的「登出成功」,游戏在此处判断是否在游戏内,如果在游戏内则退出到首页
    // 一些第三方通行证自带登出按钮,当用户点击此按钮时,也会执行此回调
    @Override
    public void logoutCallback(FYCombineResponse response) {
        if (response.getStatus() == FYCombineResponse.SUCCESS) {
            // TODO: 登出成功
        }
    }

    // 支付回调
    // 此回调不能作为支付成功的依据,故游戏不能在此处发放道具,游戏需要根据服务端的支付回调作为支付是否成功的依据,具体的服务端回调请看「服务端接入文档」https://help.737.com/archives/docs/detail/channel_combine/sdk/server
    // 此回调只可以用来控制游戏界面显示,例如 loading 框的关闭、遮罩层的关闭
    @Override
    public void payCallback(FYCombineResponse response) {
        // 星云订单号
        String orderId = (String) response.getDataValue("order_id");
        // 游戏订单号
        String gameOrderId = (String) response.getDataValue("game_order_id");
        if (response.getStatus() == FYCombineResponse.SUCCESS) {
            // TODO: 客户端支付成功
        } else if (response.getStatus() == FYCombineResponse.PAY_CANCEL) {
            // TODO: 支付取消
        } else if (response.getStatus() == FYCombineResponse.PAY_UNKNOWN) {
            // TODO: 支付状态未知
            // 第三方渠道没有给明确的客户端支付状态,建议游戏提示“如若购买成功,稍后即到账”类似的不是很明确的提示。
            // 若后续有出"九游(UC)"这个渠道,请处理这个逻辑
        } else {
            // TODO: 支付失败
            // 失败原因
            String message = response.getMessage();
        }

    }

    // 已废弃
    @Override
    public void pausePageCallback(FYCombineResponse response) {

    }

    // 退出游戏回调
    // 此回调是 Android 独有的
    // 当游戏调用 doExitGame 接口,本SDK会判断通行证平台是否有退出框,如果有,则触发此回调的「关闭应用」,游戏应在此时直接关闭应用;否则游戏可以选择弹出自定义退出框
    @Override
    public void exitGameCallback(FYCombineResponse response) {
        if (response.getStatus() == FYCombineResponse.SUCCESS) {
            // TODO: 关闭应用
        } else {
            // TODO: 弹出游戏自定义的退出框
        }
    }

    // 实名认证回调
    // 当用户填写了实名认证信息并提交完成,将触发此回调的「实名认证成功」,并提供相关的实名信息
    // 关于identityBirthday、identityAge这两个参数的使用,因不同渠道给到聚合的可能是生日也可能是年龄,所以若需使用这2个值,需对这2个值共同进行判断,如果identityAge有值就使用identityAge,如果没有就解析identityBirthday
    @Override
    public void realNameCallback(FYCombineResponse response) {
        if (response.getStatus() == FYCombineResponse.SUCCESS) {
            // 身份证生日,格式:"1991-12-31"(有可能空)
            String identityBirthday = (String) response.getDataValue("identity_birthday");
            // 身份证年龄(有可能空)
            String identityAge = (String) response.getDataValue("identity_age");

            // TODO: 实名认证成功
        } else if (response.getStatus() == FYCombineResponse.NO_REAL_NAME) {
            // TODO: 未实名游客时间,可以用来给游戏提示距离实名认证弹出还有多少时间。每隔10s会回调一次

            // 游客时间总时长,单位:秒
            String totalTime = (String) response.getDataValue("total_time");
            // 游客剩余时长,单位:秒
            String remainTime = (String) response.getDataValue("remain_time");

        } else if (response.getStatus() == FYCombineResponse.REAL_NAME_CANCEL) {

            // TODO: 实名认证取消
        } else {
            // TODO: 实名认证失败
            // 失败原因
            String message = response.getMessage();
        }
    }

    // 获取本地化商品信息回调
    // 当用户调用`queryLocalProducts`接口后,将触发此回调,返回商品信息列表
    // 还在母包测试阶段,会返回测试用的商品信息,用于调试;待打出正式渠道包后,会根据真实情况,返回正确的本地化商品信息,具体的能获取到什么以谷歌后台的配置为准`
    // 如果回调失败或者返回的本地化商品信息为空,请使用原始的商品信息进行展示
    @Override
    public void queryLocalProductsCallback(FYCombineResponse response) {

        if(response.getStatus() == FYCombineResponse.SUCCESS){

            List<HashMap> mapList = (List<HashMap>) response.getDataValue("local_product_infos");
            for(int i=0;i<mapList.size();i++){
                HashMap map = mapList.get(i);
                // 商品ID
                String productId =  String.valueOf(map.get("product_id"));
                // 本地化标题
                String title = String.valueOf(map.get("title"));
                // 本地化说明
                String desc = String.valueOf(map.get("desc"));
                // 本地化价格
                String price = String.valueOf(map.get("price"));
                // 本地化价格,包含货币单位,例如 $10 
                String formatPrice = String.valueOf(map.get("format_price"));
                // 本地化货币代号,例如 CNY
                String currencyCode = String.valueOf(map.get("currency_code"));
            }

        } else {
            // 获取本地化商品信息回调失败,请展示原始的商品信息
            // 失败原因
            String message = response.getMessage();
        }
    }

    // 绑定回调
    // 当用户触发账号绑定时,如果绑定成功,则回调成功;如果取消绑定或者绑定失败,则返回绑定失败
    // 绑定成功可以到服务端查询用户的绑定信息,具体请看「服务端接入文档」的「登录校验接口」 https://help.737.com/archives/docs/detail/channel_combine/sdk/server 
    @Override
    public void bindCallback(FYCombineResponse response) {   
        if(response.getStatus() == FYCombineResponse.SUCCESS){
            // TODO: 绑定成功   
        } else {
            // TODO: 绑定失败
        }
    }
};

FYCombineInitInfo initInfo = new FYCombineInitInfo();
initInfo.setGameVersion("1.0.0");
FYCombine.getInstance().doInit(initInfo, callback);// callback 回调方法

3.参数

参数名 说明 是否必传
gameVersion 游戏版本号

4.2 登录(必接)

1.说明

  • 启动完游戏显示首页时调用。

  • 玩家点击游戏界面的「进入游戏」时,需要判断是否有登录成功,如有则可以进入游戏;否则再次调用登录接口,让玩家重新登录,直到登录成功。

2.调用

FYCombine.getInstance().doLogin();

3.参数

4.回调

  • 登录回调 loginCallback

4.3 切换账号(必接)

1.说明

  • 在需要切换用户时调用,该接口会弹出登录窗口,让用户重新登录。

  • 与「用户登录」接口不同的是,登录接口非首次登录会自动登录,而此接口必定会弹出登录窗口。

2.调用

FYCombine.getInstance().doSwitchAccount();

3.参数

4.回调

  • 登录回调 loginCallback

4.4 支付(选接)

1.说明

  • 调用此接口将拉起支付界面

  • 建议游戏制定的商品标识格式为:com.feiyu.app_id.xxxx,以保证商品 id 的唯一性

  • 打开"星云平台->对接中心->SDK对接->SDK列表->基础接入参数->游戏支付回调地址",配置游戏服务端的支付回调地址,支付完成后会通过此地址回调支付结果
    图片

  • 客户端的支付回调不能作为支付成功的依据,不能在此处发放道具。判断支付是否成功要根据服务端的支付回调。具体的服务端回调请看服务端接入文档

  • 客户端的支付回调只可以用来控制游戏界面显示,例如loading框的关闭、遮罩层的关闭

2.调用

FYCombinePayInfo payInfo = new FYCombinePayInfo();
payInfo.setPlayerId("role_id_001");
payInfo.setPlayerName("role_name_001");
payInfo.setPlayerLevel("1");
payInfo.setServerId("1");
payInfo.setServerName("server_name_001");
payInfo.setGoodsId("com.feiyu.20001.store1");
payInfo.setGoodsName("产品1");
payInfo.setPayAmount("100");
payInfo.setGameOrderId(FYStringUtils.getRandomUUID());
payInfo.setNotifyExt("extra");
payInfo.setVipLevel("1");
payInfo.setPaySignType("md5");
payInfo.setNotifyURL("https://www.xxxx.com/xxxx");

FYCombine.getInstance().doPay(payInfo);

3.参数

参数名 说明 是否必传
playerId 角色id。对应服务端支付回调的player_id参数
playerName 角色名
playerLevel 角色等级,数字格式
serverId 区服id,数字格式。对应服务端支付回调的server_id参数
goodsId 商品标识,规范格式:com.feiyu.app_id.xxxx,例: com.feiyu.20001.store1 。对应服务端支付回调的goods_id参数
goodsName 商品名称
payAmount 支付金额,单位:分 (海外游戏传美分),数字格式。对应服务端支付回调的total_amount参数
gameOrderId 游戏订单号,由游戏生成并管理,服务端支付验证的时候会用到。对应服务端支付回调的out_trade_no参数
notifyExt 额外参数,游戏的透传参数可通过此参数传递,支付完成后平台服务端会回调此参数给游戏服务端。对应服务端支付回调的notify_ext参数
vipLevel vip等级,数字格式,如果游戏没有vip等级则传"0"
paySignType 签名类型,游戏服务器接收回调通知签名方式,需要游戏传递:md5/rsa
notifyURL 1.通过该值能在客户端动态传递服务端支付回调地址;2.若您在客户端传递了该地址,则支付完成后会通过此地址回调支付结果;3.若您同时也在星云后台配置了支付回调地址,会优先回调客户端传递的地址;4.需要先配置支付回调可信域名,请前往"星云后台->对接中心->回调配置->支付回调可信域名"进行配置,否则无法回调成功;5.若您在客户端传递了该地址,在游戏包体发布之前,建议您仔细检查该参数是否配置正确,以防止包体发布后支付出现问题

4.回调

  • 支付回调 payCallback

4.5 用户中心(必接)

1.说明

  • 需在游戏内的设置界面,放置一个「用户中心」按钮,点击按钮调用此接口

  • 调用此接口将弹出用户中心界面

2.调用

FYCombineUserCenterInfo info = new FYCombineUserCenterInfo();
info.setPlayerId("xxx");
info.setPlayerName("xxx");
info.setPlayerLevel("xxx");
info.setServerId("xxx");
info.setServerName("xxx");
info.setVipLevel("xxx");
FYCombine.getInstance().doUserCenter(info);

3.参数

参数名 说明 是否必传
playerId 角色id
playerName 角色名
playerLevel 角色,数字格式
serverId 区服id,数字格式
serverName 区服名称
vipLevel vip等级,数字格式,如果游戏没有vip等级则传"0"

4.6 登出(选接)

1.说明

  • 登出 SDK,并回调登出回调给游戏。

2.调用

FYCombine.getInstance().doLogout();

3.参数

4.回调

  • 登出回调 logoutCallback

4.7 退出游戏(选接)

1.说明

  • 当用户按手机返回键,意图退出应用时调用。

2.调用

FYCombine.getInstance().doExitGame();

3.参数

4.回调

  • 退出游戏回调 exitGameCallback

4.8 获取本地化商品信息(选接)

1.说明

  • 如果后续有出"海外官方Android渠道",请对接此接口

  • 应用场景1:获取本地化商品信息。当游戏在不同国家或地区发行时,想要展示不同的商品信息,请调用此接口,在回调中接收商品信息;能获取到的什么本地化商品信息,取决于您在谷歌后台的本地化商品配置,如果没有配置,则会回调失败或回调空,此时您应该使用原始的商品信息进行展示;在母包阶段,会回调测试用的商品信息用于调试,请在打出渠道包后再核实一下真实的商品信息是否展示正确;应尽量在发起支付提前久一点调用此接口,因为系统需要有一点时间(10秒内)异步去获取商品信息,并应避免重复调用此接口,正确做法:在进入游戏后调用一次此接口,并将获取到的商品信息缓存下来,在用户查看商店时,将缓存下来的商品信息用于展示

  • 应用场景2:加速内购拉起。游戏拉起谷歌内购比较慢,是由于首次拉起该商品内购时,系统需要时间请求该商品信息,如果想要提高内购拉起速度,请在在进入游戏后调用一次此接口,系统会进行一次内购商品信息获取并缓存下来,后续再拉起商品内购就会很快;如果只是单纯想要提高内购拉起速度,而不需要进行本地化商品展示,则不需要在回调中处理任何逻辑

2.调用

List<String> products = new ArrayList<>() ;
list.add("com.feiyu.xxx.product1");
list.add("com.feiyu.xxx.product2");
FYCombine.getInstance().queryLocalProducts(products);

3.参数

参数名 说明 是否必传
products 商品 id 列表

4.回调

  • 获取本地化商品信息回调 queryLocalProductsCallback

4.9 第三方收集信息(选接)

1.说明

  • 用于收集第三方SDK收集游戏数据。
  • 如果后续有出"B站"、"九游(UC)"、"OPPO"、"vivo"、"华为" 这几个渠道中任意一个,请对接此接口,否则上架渠道会被拒。

2.调用

Map info = new HashMap<String, String> ();
info.put("method","xxx"); //method (进入区服:enterServer,创建角色:createRole ,角色升级:levelUp) 
info.put("playerId","xxx");//角色ID
info.put("playerName","xxx");//角色名称
info.put("playerLevel","xxx");//角色等级
info.put("serverId","xxx");//区服ID
info.put("serverName","xxx");//区服名称
info.put("playerTime","123456");//角色创建时间,必须取服务端时间,必须为时间戳
FYCombine.getInstance().doCollectInfo(info);

3.参数

参数名 说明 是否必传
infoDict 要收集的信息,key 和 value 根据第三方SDK 需求决定

4.10 生命周期(必接)

1.说明

  • 在游戏界面 Activity 相应的生命周期方法中调用,必须全部都接入。

2.调用

  • onCreate()
FYCombine.getInstance().onCreate();
  • onActivityResult()
FYCombine.getInstance().onActivityResult(requestCode,resultCode,data);
  • onStart()
FYCombine.getInstance().onStart();
  • onStop()
FYCombine.getInstance().onStop();
  • onNewIntent()
FYCombine.getInstance().onNewIntent(intent);
  • onResume()
FYCombine.getInstance().onResumed();
  • onRequestPermissionsResult()
FYCombine.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
  • onDestroy()
 FYCombine.getInstance().onDestroy();
  • onPause()
FYCombine.getInstance().onPaused();
  • onRestart()
FYCombine.getInstance().onRestart();

4.11 获取配置参数(选接)

1.说明

  • 游戏有用到聚合 SDK 的一些配置参数,可以从此处获取。

2.调用

  • APP ID
String appId = FYCombine.getInstance().getAppId();
  • 获取渠道ID,如果游戏要对渠道做差异化处理时,可以使用此ID作为区分;渠道ID列表,请查看星云平台->对接中心->渠道打包->渠道配置;在母包阶段,Android获取到的渠道ID默认为10000,iOS获取到的渠道ID默认为10001
String channelId = FYCombine.getInstance().getChannelId();
  • 设备 ID,此 ID 为 SDK 生成的标识设备的唯一 ID,不是 IDFA 或 AndroidID
String deviceId = FYCombine.getInstance().getDeviceId();
  • 通行证标识,用来标明该渠道用什么通行证进行登录,如果游戏要对不同通行证做差异化处理时,可以使用此标识作为区分,例如:feiyu3、uc、yingyongbao,所有渠道的通行证标识请看渠道版本信息
String passportCode = FYCombine.getInstance().getPassportCode();
  • 支付标识,用来标明该渠道用什么支付方式,一般和通行证代号一致,有一些特殊的渠道登录和支付不一致,例如:苹果渠道,登录是飞鱼通行证(feiyu3),支付则是苹果支付(apple),所有渠道的支付标识请看渠道版本信息
String paymentCode = FYCombine.getInstance().getPaymentCode();

4.12 广告监测上报(选接)

1.方法

  • public void doADTrackingReport(String event, Map params)

2.说明

  • 作用:此接口用来触发第三方渠道的广告监测事件上报
  • 使用说明,以华为渠道为例:
    • 对接:游戏在对应的时机调用此接口,通过传入不同的事件常量以及事件参数,来触发相应的上报事件
    • 调试:游戏对接完成后,导出Android游戏母包,可通过SDK调试模式,查看该接口是否对接成功,详情请看本文档第2.4小节
    • 配置:打开星云平台-对接中心-渠道打包-渠道配置-华为渠道-配置,将ad_tracking_switch设置为1,并配置其他 ad_tracking 开头的参数(参数由投放人员提供)
    • 打包:将Android游戏母包上传到星云后台,通过Android打包工具,输出华为渠道包,此包体即带有华为的广告上报功能
  • 注意:
    • 游戏按照文档中给出的调用时机接入各个事件,但是在接入之前要跟发行同学再次确认,以对齐数据统计标准
    • 目前此接口只在导出的Android包体上有作用,导出iOS的包体无需关心此接口

3.调用

// 事件名称:启动
// 调用时机:需在刚启动游戏的时候调用,若有隐私授权弹窗,需在点击隐私授权弹窗确认之后调用
// 事件常量:START
// 事件参数:无
Map map = new HashMap();
FYCombine.getInstance().doADTrackingReport(FYCombineADTrackingConst.START,map);

// 事件名称:创建角色
// 调用时机:需在游戏创建角色的调用
// 事件常量:CREATE
// 事件参数:
//      playerId:角色唯一标识,字符串
Map map = new HashMap();
map.put("playerId","xxxx");
FYCombine.getInstance().doADTrackingReport(FYCombineADTrackingConst.CREATE,map);

// 事件名称:进入游戏
// 调用时机:需在角色进入游戏的调用
// 事件常量:ENTER
// 事件参数:
//      playerId:角色唯一标识,字符串
Map map = new HashMap();
map.put("playerId","xxxx");
FYCombine.getInstance().doADTrackingReport(FYCombineADTrackingConst.ENTER,map);

// 事件名称:支付
// 调用时机:需在支付完成之后调用
// 事件常量:PAY
// 事件参数:
//      payAmount:支付金额,数字,单位-分,例如支付1元需传100
Map map = new HashMap();
map.put("payAmount",100);
FYCombine.getInstance().doADTrackingReport(FYCombineADTrackingConst.PAY,map);

4.参数

参数名 说明 是否必传
eventName 事件常量,字符串,用来区分不同的事件
paramsJson 事件参数,json字符串,用来传递事件的参数,如果没有参数传""字符串
  • 事件定义:
eventName 说明 是否必接
START 启动,需在刚启动游戏的时候调用,若有隐私授权弹窗,需在点击隐私授权弹窗确认之后调用
CREATE 创建角色,需在游戏创建角色的调用
ENTER 进入游戏,需在角色进入游戏的调用
PAY 支付,需在支付完成之后调用
  • CREATE 事件参数说明:
参数 说明 是否必传
playerId 角色唯一标识,字符串
  • ENTER 事件参数说明:
参数 说明 是否必传
playerId 角色唯一标识,字符串
  • PAY 事件参数说明:
参数 说明 是否必传
payAmount 支付金额,数字,单位-分,例如支付1元需传100

4.13 广告追踪数据获取(选接)

1.方法

  • public String getADTrackingData()

2.说明

  • 作用:此接口用来获取广告追踪数据
  • 使用说明,以华为渠道为例:
    • 对接:游戏在聚合初始化回调之后对应的时机调用此接口
    • 配置:打开星云平台-对接中心-渠道打包-渠道配置-华为渠道-配置,将ad_tracking_switch设置为1,并配置其他 ad_tracking 开头的参数(参数由投放人员提供)
    • 打包:将Android游戏母包上传到星云后台,通过Android打包工具,输出华为渠道包,此包体即带有华为的广告上报功能,可获取追踪数据
  • 注意:
    • 游戏需要在聚合初始化回调之后调用
    • 目前此接口只在导出的Android包体上有作用,导出iOS的包体无需关心此接口
    • 目前此接口数据有可能获取到空,获取到数据JSON字符串格式,使用try{}catch(){}方式,防止报错

3.调用

String hwTrackingDataStr = FYCombine.getInstance().getADTrackingData();

try {
    JSONObject hwTrackingDataJson = new JSONObject(hwTrackingDataStr);
    if(hwTrackingDataJson != null){
        String taskId = hwTrackingDataJson.optString("taskid");
        String subTaskId = hwTrackingDataJson.optString("subTaskId");
        String callback = hwTrackingDataJson.optString("callback");
        String channel = hwTrackingDataJson.optString("channel");
        String rtaId = hwTrackingDataJson.optString("RTAID");
    }

} catch (JSONException e) {
    e.printStackTrace();
}

4.返回参数

参数名 说明
taskid 任务ID,可能为空
subTaskId 子任务ID,如"200037037",可能为空
callback 回传参数,用于oCPD对接,如"security:CD40F6*****C7A9F4",可能为空
channel 由广告主运营在华为投放系统针对广告任务绑定的智能分包渠道号,可能为空
RTAID 华为投放系统返回RTAID,可能为空

5 3 F&Q

5.1 切换账号的流程是怎样的?

常规的流程:点击用户中心的切换账号 -> 接收到退出回调(logoutCallback) -> 退出到登录首屏 -> 调出登录窗口 -> 登录另一个账号 -> 点击进入游戏 -> 游戏中

非常规的流程:点击用户中心的切换账号 -> 弹出登录窗口 -> 登录另一个账号 -> 接收到登录回调(loginCallback) -> 检测 open_id 变了 -> 退出到登录首屏 -> 检测已有账号登录 -> 点击进入游戏 -> 游戏中

非常规的流程会出现在某些渠道(比如 4399),没有退出回调,直接呼出登录窗口。那这时候就需要检查 open_id 是否改变,来让游戏重新回到登录首屏。

也就是说,以上这 2 个流程,游戏都要有。

5.2 渠道ID(channel_id)和通行证标识(passport_code)有啥区别?

  • 一种通行证标识,可以对应多个渠道ID,渠道ID的颗粒度是最低的。游戏对渠道做区分,通常用渠道ID 即可,这个是最保险的方法。如果只想粗颗粒度的区分不同类型的渠道,则用通行证标识。

  • 具体渠道ID的值,可以查看星云后台的 对接中心-渠道打包-渠道配置 。

  • 具体通行证标识,可以查看渠道版本信息