# GUNION SDK 开发手册 for Android (AUTH 功能)

# 1. 前言

本文用于指导游戏开发商接入SDK,文中包含客户端的接入说明,以及服务器接口的介绍;

# 2. SDK接入流程概述

  • 搭建SDK开发环境

  • 完成隐私政策展示逻辑(请务必在完成隐私的展示逻辑之后再进行调用初始化 以及游戏自身敏感权限申请(申请请务必避开初始化接口调用)等操作)(游戏使用sdk隐私政策弹框请接接口4; 游戏自己实现隐私政策弹框请接接口5接口6

  • 初始化SDK

  • 初始化成功,调用账号功能相关接口

  • 其他功能接口,可根据业务需要适时调用

  • 销毁SDK

  • 游戏在启动游戏时需对设备网络进行判断,若无网络的情况下,游戏需实现对用户的弹框提示。

  • GHome sdk中已占用的申请系统权限的code: 159, 165, 169( 游戏请勿使用这些code进行权限申请,以免冲突)

  • SDK 结构介绍

    jar/aar 作用
    daoyu-opensdk-vXXXX.aar 叨鱼三方登录
    greport.aar 日志上报
    open_sdk_XXXX.jar QQ登录
    oaid_sdk_XXXX.aar 移动安全联盟设备标识符
    MY_GUNIONAUTH_SDK_vXXX.aar 登录
    G_UNION_PAY_vXXXX.aar 支付(只接入登录可删除)
    ghomegshare_vXXXX.aar 分享(只接入登录可删除)

# 隐私流程介绍

APP启动代码流程参考

含隐私相关建议,非常重要

流程 功能 备注
1 app启动
2 游戏初始化A a. 因国家隐私政策,建议如无必须可以后置执行,如果需要执行则不能包含用户信息获取逻辑
b. 游戏框架(例如:Untiy框架等)自身也可能导致隐私信息获取,游戏需要重点关注。【非常重要】
3 隐私接口

(游戏实现,或者使用 ghome sdk)
a. 使用 ghome sdk 隐私接口,会自行处理需要显示,但如果游戏使用则每次启动都需要调用
4 同意隐私

(用户点击隐私同意后,并产生回调)
a. 如果第3点使用ghome sdk模式,并ghome sdk当前判断不需要再次显示隐私条款,则会直接回调,即用户点过同意
5 游戏初始化B

(可含用户信息获取等)
a. 强烈建议游戏更多的初始化代码放在隐私条款同意之后执行,以免引起隐私相关的拒审
b. 如无特殊需求,游戏也可以省略初始化A,只保留初始化B模式,更不容易因隐私问题引起拒审
6 登录初始化

# 隐私模式说明(Ghome SDK 有关的函数使用顺序)

模式 1 :使用 Ghome SDK UI 显示隐私框
    游戏APP启动
    -> 游戏初始化1(建议省去)
    -> doPrivacyAgreement
    -> 游戏初始化2
    -> initialize
    -> login

模式 2 :使用 Ghome SDK API 返回隐私 URL 后,游戏 APP UI 显示
    游戏APP启动
    -> 游戏初始化1(建议省去)
    -> getAgreementStatus
    -> onUserAgreement(当用户点击同意后调用)
    -> 游戏初始化2
    -> initialize
    -> login
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# GHome SDK调试日志开关

GHome.getInstance().setGHomeSDKDebuggable(true); //如果开启调试日志,发布包记得删除或设置成false关闭调试日志
1

# 3. 开发环境要求

# 3.1. 集成SDK文件到游戏工程

  • 将压缩包中的aar文件全部拷贝到游戏工程的libs里即可

  • 将游戏对应的oaid的证书文件放入assets(具体申请可浏览移动联盟官网 (opens new window),注意当前政策下证书存在有效期1年)

  • 游戏工程的build.gradle 引入本地以及在线依赖库:

api fileTree(includes: ['*.jar', '*.aar'], dir:  'libs')

implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.multidex:multidex:2.0.1'

implementation 'io.github.sinaweibosdk:core:13.10.1@aar'
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.26'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'

implementation 'com.google.code.gson:gson:2.10.1'
1
2
3
4
5
6
7
8
9
10

# 3.2. 配置AndroidManifest.xml文件

注意:

1、targetSdkVersion >= 30

2、minSdkVersion >= 23

  • 修改游戏工程的AndroidManifest.xml文件中Application节点:

修改Application类为“com.ghome.sdk.GHomeApplication”,

<application
    android:name="com.ghome.sdk.GHomeApplication"
    android:usesCleartextTraffic="true"
    android:requestLegacyExternalStorage="true">
1
2
3
4
  • 如果游戏已经有自己自定义的Application(比如MyXXXGameApplication),那么该自定义的Application需要继承GHomeApplication类:
<application
    android:name="com.ghome.sdk.demo.MyXXXGameApplication"
    android:usesCleartextTraffic="true"
    android:requestLegacyExternalStorage="true">


public class MyXXXGameApplication extends GHomeApplication {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • AndroidManifest.xml中可配置是否对获取手机状态权限进行申请(一般无需配置,sdk会有默认逻辑)
<!-- 是否需要在安卓10以下申请手机状态权限 ,ghome sdk默认true 一般无需配置 或修改-->
<meta-data android:name="NEED_READ_PHONE_STATE" android:value="true"/>
1
2

# 3.3. 接口回调相关code常量定义

常量类所在包路径 com.ghome.sdk.common.Constants :

public static final int ERROR_CODE_SUCCESS = 0;
public static final int ERROR_CODE_LOGIN_CANCEL = -100;
public static final int ERROR_USER_NOT_LOGIN = -10869607;
public static final int ERROR_LOGIN_FAILED = -10869608;
public static final int ERROR_INIT_FAILED = -10869610;

常量类所在包路径 com.ghome.sdk.common.IGHomeApi :


文档接口里使用的Callback所在包路径:
com.ghome.sdk.common.IGHomeApi.Callback;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 4. 调用sdk的隐私协议展示功能

注意(重要):

游戏需使用sdk的隐私政策功能的话则必接,否则不要接

游戏可调用该接口展示用户协议(隐私协议相关逻辑都交给sdk处理, 游戏只需在启动游戏调用该接口并等待同意与否的回调即可)

  • 接口:

    doPrivacyAgreement(final Activity activity, final String appId, final Callback callback);

  • 参数说明:

    activity: Activity对象。

    appId:游戏在手游直通车平台上申请得到的ID。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    如游戏是自己实现隐私协议相关弹框展示功能则无需调用该接口, 否则必接

  • 代码示例:

GHome.getInstance().doPrivacyAgreement(mContext, "791000008", new IGHomeApi.Callback() {
        @Override
        public void callback(int code, String message, Map<String, String> data) {
            if (code == Constants.ERROR_CODE_SUCCESS) {
                // 调用了sdk的隐私政策功能并得到同意,可继续游戏后续运行逻辑
            } else {
                // 玩家不同意隐私政策,游戏可根据自身需求 做直接退出游戏等操作
                // finish();
            }
        }
    });
1
2
3
4
5
6
7
8
9
10
11

# 5. 获取是否需要展示隐私协议弹框

注意(重要):

游戏使用自己的隐私弹框逻辑的话则必接,否则不要接

  • 说明: 游戏在两种场景之前需要调用该接口获取是否显示隐私协议弹框。

    场景1: 启动游戏

    场景2: 调用GHome的login接口之前

  • 接口:

    getAgreementStatus(Activity activity, String appId, boolean isForLogin, Callback callback);

  • 参数说明:

    activity: Activity对象。

    appId:游戏在手游直通车平台上申请得到的ID。

    isForLogin: 是否是在去调用login接口之前的查询(true),(例如:对应于启动游戏时的查询传false)

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    如游戏是自己实现隐私协议相关弹框展示功能则必接,否则请勿调用该接口; 并且在同意与否的操作时 需要调用反馈接口

  • 代码示例:

//启动游戏 false
GHome.getInstance().getAgreementStatus(mContext, mContext.gameId, false, new IGHomeApi.Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == 0 && data != null && data.get("status").equals("1")) {
            //游戏方自己处理隐私政策展示功能
            AlertDialog agreeDialog = new AlertDialog.Builder(mContext).setMessage(data.get("privacyContent")).setNegativeButton("不同意", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    GHome.getInstance().onUserAgreement(mContext, true, false);
                    //TODO exit game
                }
            }).setPositiveButton("同意并继续", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    GHome.getInstance().onUserAgreement(mContext, true, true);
                    //TODO 继续初始化或者登录行为
                }
            }).create();
            agreeDialog.setCancelable(false);
            agreeDialog.show();
        } else {
            mGHome.login(mContext, mContext.loginCallback);
        }
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 6. 隐私协议结果反馈接口

注意(重要):

游戏自己实现的隐私政策则必接,否则不接

游戏需要在隐私协议弹窗后,根据用户选择同意与否调用该接口。

  • 接口:

    onUserAgreement(Activity activity, boolean isUserAction, boolean isAgreed);

  • 参数说明:

    activity: Activity对象。

    isUserAction:是否用户主动同意隐私协议(主动选择true,其他选择或者选第一次选择之后后面默认选项false)

    isAgreed: 是否同意隐私协议

  • 注意事项: 如游戏没有隐私协议弹窗,则需要在后台配置参数,弹出SDK自带隐私协议弹窗。

  • 代码示例:

//用户选择弹框同意
GHome.getInstance().onUserAgreement(getActivity(), true, true);
//之后用户默认同意
GHome.getInstance().onUserAgreement(getActivity(), false, true);
1
2
3
4

# 7. 基础功能(必接)

# 7.1. SDK初始化接口(需要在用户同意隐私政策之后调用)

游戏客户端需要在游戏启动的第一个Activity的onCreate()方法中调用该接口(注意在super.onCreate(); 和 GHome.getInstance().onCreate(this); 之后),在调用GHome SDK其他API前需先调用此接口对SDK进行初始化。否则可能无法正常使用后续的接口。如果游戏在自身初始化的时候有动态权限申请,务必在权限申请完成后再调用G家初始化接口。

  • 接口:

    initialize(final Activity activity, final String gameId, final Callback callback);

  • 参数说明:

    activity: Activity对象。

    gameId: 游戏在手游直通车平台上申请得到的ID。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    游戏在启动游戏时需对设备网络进行判断,若无网络的情况下,游戏需实现对用户的弹框提示。

    如果没有特别说明,在初始化接口成功之前调用其他接口都有可能出现错误,请确保初始化接口成功之后再调用其他接口。

  • 代码示例:

GHome.getInstance().initialize(this, "791000008", new Callback() {

    @Override
    public void callback(int code, String message, Map<String, String> data) {
        // success
        if(code == Constants.ERROR_CODE_SUCCESS) {
            //初始化成功
        }  else if(code == Constants.ERROR_INIT_FAILED) {
            //初始化失败 无需处理
        }
    }
});
1
2
3
4
5
6
7
8
9
10
11
12

# 8. 账号功能(必接)

# 8.1. 客户端登录

# 8.1.1 客户端登录接口

游戏客户端可以调用登录接口为玩家提供登录功能。若用户第一次登录,将显示登录和注册的界面。若用户上次使用账号成功登录过,则会用该账号自动登录。 (重要:如果游戏使用自己的隐私政策弹框功能, 则需要在调用login之前调用查询是否需要弹隐私政策的接口,查询接口说明请参考 接口5

  • 接口:

    login(final Activity activity, final Callback callback);

  • 参数说明:

    activity: Activity对象。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHome.getInstance().login(this, new Callback() {

    @Override
    public void callback(int code, String message, Map<String, String> data) {
        // 登陆结果的回调。
        // 开发者可以仅处理登陆成功的情况。
        if (code == Constants.ERROR_CODE_SUCCESS) {
            // 如果游戏需要,可以在登录成功后,通过data获取到以下信息。
            // userid是该玩家在我们平台的用户id号;
            // ticket是本次登录得到的票据,用来给游戏服务器向平台服务器验证本次登陆是否合法;
            // isGuest如果有返回并且字符串是"true"表示是游客,不返回或其他表示非游客。
            System.out.println("userid=" + data.get("userid"));
            System.out.println("ticket=" + data.get("ticket"));
            System.out.println("isGuest=" + "true".equal(data.get("isGuest")==null?"":data.get("isGuest")));

            // 登录成功,进入游戏界面,游戏开发者补充逻辑。
        } else if(code == Constants.ERROR_INIT_NOT_FINISHED) {
            //可在此处再次调用初始化接口

            //mContext.loginEnter = true;
            //mContext.gameId = "791000008";
            //mGHome.initialize(mContext, mContext.gameId, mContext.initCallback);
        } else if (code == Constants.ERROR_CODE_LOGIN_CANCEL) {
            // 游戏客户端需要在这里处理返回至游戏界面,玩家点击屏幕或者登录按键时再次调用login接口弹出登录框
        } else {
            //登录失败无需处理
        }
    }

});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 8.2. 客户端登出接口

游戏客户端可以在游戏内需要登出账号的地方调用该接口,执行成功将删除自动登录的记录信息,玩家下次登录后将不再自动登录,而是显示出登录界面。

  • 接口:

    logout(final Activity activity, final Callback callback);

  • 参数说明:

    activity: Activity对象。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHome.getInstance().logout(this, new Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == Constants.ERROR_CODE_SUCCESS) {
            // 注销成功
        } else {
            // 注销失败
        }
    }
});
1
2
3
4
5
6
7
8
9
10

# 8.3. 切换账号接口

游戏里有切换账号入口的情况应调用这个接口来实现切换账号功能。

  • 接口:

    switchAccount(final Activity activity, final Callback agreementCallback, final Callback callback);

  • 参数说明:

    activity: Activity对象。

    agreementCallback: 用于接收隐私协议弹框的通知,收到该回调时游戏根据status状态弹出自己的隐私弹框,切记如果游戏方使用的sdk的隐私弹框功能则该参数传null对象 或 不传)

    callback: 回调对象,用来回调执行结果,详情请参考代码示例。

  • 代码示例:

//游戏使用sdk的隐私弹框功能, 第二个参数则传 null: GHome.getInstance().switchAccount(mContext, null, callback);

//游戏使用自己实现的隐私弹框功能,第二个参数传入agreementCallback对象, 示例如下:
GHome.getInstance().switchAccount(mContext, new IGHomeApi.Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == 0) {
            //弹游戏自己的隐私政策弹框(通过data.get("privacyContent") 取内容)
            if (data != null && data.get("status") != null && data.get("status").equals("1")) {
                //模拟游戏方自己处理隐私政策展示功能 start
                GameAgreementOperationDialog agreementDialog = new GameAgreementOperationDialog(getContext());
                agreementDialog1.setContentUrl(data.get("privacyContent"));
                agreementDialog1.setOperationListener(new GameAgreementOperationDialog.GameAgreementOperationListener() {
                    @Override
                    public void onOperateCallback(boolean isAgree) {
                        GHome.getInstance().onUserAgreement(mContext, true, isAgree);
                    }
                });
                agreementDialog.show();
                //模拟游戏方自己处理隐私政策展示功能 end
            } else {
                GHome.getInstance().onUserAgreement(mContext, false, true);
            }
        } else {
        }
    }
}, new Callback() {
    @Override
    public void callback(int code, String msg, Map<String, String> data) {
        // 切换账号结果的回调。
        // 切换账号失败会有Toast提示,所以开发者可以不处理切换账号失败的情况。
        if (code == Constants.ERROR_CODE_SUCCESS) {
            // 切换账号成功,通过data返回账号信息(获取用户信息同登录接口)。
            // userid是该玩家在我们平台的用户id号;
            // ticket是本次切换账号得到的票据,用来给游戏服务器向平台服务器验证本次登陆是否合法;
            // isGuest如果有返回并且字符串是"true"表示是游客,不返回或其他表示非游客。
            System.out.println("userid=" + data.get("userid"));
            System.out.println("ticket=" + data.get("ticket"));
            System.out.println("isGuest=" + "true".equal(data.get("isGuest") == null ? "" : data.get("isGuest")));
        } else if (code == Constants.ERROR_CODE_LOGIN_CANCEL) {
            // 代表切换账号取消,但是此时已经是登出状态了
            // 游戏客户端需要在这里做退出游戏还是重新打开登陆界面的处理
        } else {
            //默认是切换账号失败,无需处理
        }
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 8.4. 客户端注销删除账号接口

游戏客户端可以在游戏内提供注销账号的场所调用该接口,需要在收到注销回调成功之后退出回到登录。

  • 接口:

    writtenOff(final Activity activity, final Callback writtenOffCallback);

  • 参数说明:

    activity: Activity对象。

    writtenOffCallback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHome.getInstance().writtenOff(this, new Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == Constants.ERROR_CODE_SUCCESS) {
            // 注销删除账号成功,游戏这里退出游戏登录态回到登录页即可,(同logout处理
        } else {
            // 注销删除账号取消或者失败 无需处理
        }
    }
});
1
2
3
4
5
6
7
8
9
10

# 9. 扩展功能(可选)

# 9.1. 客户端获取游戏区服列表接口

游戏客户端可以调用该接口获取游戏在G家平台登记的区服配置。

  • 接口:

    getAreaConfig(final Activity activity, final Callback callback);

  • 参数说明:

    activity: Activity对象。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    暂无

  • 代码示例:

GHome.getInstance().getAreaConfig(this, new Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == 0) {
            String json = data.get("data"));
        }
    }
});
1
2
3
4
5
6
7
8
  • JSON格式说明:
{
  "message":[
  {
    "area_code":"1",  // 开发商后台配置的区服ID
    "name":"area1"    // 开发商后台配置的区服名称
    "group_id":"1"    // 开发商后台配置的区组ID
    "group_name":"gourp1"    // 开发商后台配置的区组名称
  },
  ...
  ]
}
1
2
3
4
5
6
7
8
9
10
11

# 9.2. 客户端获取一次性登录票据接口

游戏客户端在接入其他需要登录G家平台的应用时(如:客服、论坛等。),可以调用该接口获取一个一次性小票提供给应用完成登录。

  • 接口:

    getTicket(final Activity activity, final String appId, final String areaId, final Callback callback);

  • 参数说明:

    参数 类型 说明
    activity Activity Activity对象
    appId String 需要使用该票据完成登录的应用ID。
    areaId String 需要使用该票据完成登录的应用区ID,如果该应用没有区的概念可以传"0"
    callback Callback 回调对象,用来回调执行结果,详情请参考代码示例。
  • 注意事项:

    必须在登录成功之后才可以使用该接口

  • 代码示例:

GHome.getInstance().getTicket(mContext, appId, areaId, new Callback() {
    @Override
    public void callback(int code, String msg, Map<String, String> data) {
        if (code == Constants.ERROR_CODE_SUCCESS) {
            if (data != null) {
                final String ticket = (String) data.get("ticket");
                //获取成功  继续游戏验证登录逻辑。
            } else {
                DemoToastUtil.showToast(mContext, msg);
            }
        } else if(code == Constants.ERROR_NETWORK_TIMEOUT) {
            // 票据获取失败,但可以重试(包含网络问题)
            // 游戏停留当前UI,并提示用户返回的 msg
            // 用户点击msg关闭信息窗口后,可以点击“进入游戏”继续(重新走getticket流程)
            DemoToastUtil.showToast(mContext, msg);
        } else {
            // 票据获取失败,但重试也可能回复(服务端有明确的特别错误码)
            // 游戏停留当前UI,并提示用户返回的 msg
            // 用户点击msg关闭信息窗口后,建议游戏实现App关闭(也可以关闭并重启)
            DemoToastUtil.showToast(mContext, "code:" + code + " msg:" + msg);
        }
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 10. 生命周期等接口(必接)

# 10.1. 客户端上报游戏区接口

游戏客户端在用户选择区时需要调用该接口,否则数据报表将无法按区提供。

  • 接口:

    loginArea(final Activity activity, final String areaId, final String groupId);

  • 参数说明:

    activity: Activity对象。

    areaId: 用户进入游戏所选择的区ID。

    groupId: 组ID, 没有该实际数据则传空("")

  • 代码示例:

GHome.getInstance().loginArea(this, "1", "99");
1

# 10.2. 生命周期以及权限回调接口

注意(重要):

在游戏客户端主Activity中接入

  • 代码示例:
@Override
protected void onCreate() {
    super.onCreate();
    GHome.getInstance().onCreate(this);
}

@Override
protected void onResume() {
    super.onResume();
    GHome.getInstance().onResume(this);
}

@Override
protected void onStart() {
    super.onStart();
    GHome.getInstance().onStart(this);
}

@Override
protected void onRestart() {
    super.onRestart();
    GHome.getInstance().onRestart(this);
}

@Override
protected void onPause() {
    super.onPause();
    GHome.getInstance().onPause(this);
}

@Override
protected void onStop() {
    super.onStop();
    GHome.getInstance().onStop(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    GHome.getInstance().onDestroy(this);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    GHome.getInstance().onNewIntent(this, intent);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    GHome.getInstance().onActivityResult(this, requestCode, resultCode, intent);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    GHome.getInstance().onBackPressed(this);
}

//申请权限回调接口
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    GHome.getInstance().onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    GHome.getInstance().onWindowFocusChanged(this, hasFocus);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

# 11. 其他接口(非必接)

# 11.1. 获取渠道号

# 11.1.1. 获取一级渠道号

游戏可调用以下接口来获取一级渠道号

  • 接口:

    getApplicationSuperChannel(Context context);

  • 参数说明:

    context 上下文(可通过getApplicationContext()获取)

  • 注意事项:

    在初始化完成前或完成后调用都可以。

  • 代码示例:

GHome.getInstance().getApplicationSuperChannel(getApplicationContext());
1
# 11.1.2. 获取二级渠道号

游戏可调用以下接口来获取二级渠道号

  • 接口:

    getCPSChannelCode(Context context);

  • 参数说明:

    context 上下文(可通过getApplicationContext()获取)

  • 代码示例:

GHome.getInstance().getCPSChannelCode(getApplicationContext());
1

# 11.2. 获取G家设备id

G家使用的设备id的字符串

  • 接口:

    getGHomeDeviceId(final Activity activity)

  • 参数说明:

    activity: Activity对象。

  • 代码示例:

GHome.getInstance().getGHomeDeviceId(this)
1

# 12. 获取用户条款和隐私政策(选接)

游戏获取用户条款和隐私政策页面的URL / html页面内容代码 (接入接口时根据自身需求二选一)

  • 接口:

    getAgreement(final Activity activity, final String appId, final Callback callback); //页面的URL

    getAgreementContent(final Activity activity, final String appId, final Callback callback); //html页面内容代码

  • 参数说明:

    activity: Activity对象。

    appId: 游戏在 GPOP 上申请得到的ID。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

//获取页面url
GHome.getInstance().getAgreement(mContext, "791000008", new Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == 0 && data != null) {
            String dataJson = data.get("data");
            //游戏自己解析该json. json内容字段说明请看文档
            GetAgreementVersionAContent content = GsonUtil.fromJson(dataJson, GetAgreementVersionAContent.class);
            if (content != null) {
                String agreementServiceUrl = null;
                String agreementPrivacyUrl = null;
                for (AgreementDetail detail : content.agreements) {
                    if (detail != null) {
                        if (detail.type == 1) {//服务协议
                            agreementServiceUrl = detail.url;
                        } else if (detail.type == 2) {//隐私政策
                            agreementPrivacyUrl = detail.url;
                        } else if (detail.type == 0) {//聚合页
                        }
                    }
                }
                Toast.makeText(mContext, "隐私政策Url:" + agreementPrivacyUrl + "\n服务协议Url: " + agreementServiceUrl, Toast.LENGTH_SHORT).show();
            }
        }
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//获取页面内容
GHome.getInstance().getAgreementContent(mContext, "791000008", new Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == 0 && data != null) {
            String dataJson = data.get("data");
            //游戏自己解析该json. json内容字段说明请看文档
            GetAgreementVersionAContent content = GsonUtil.fromJson(dataJson, GetAgreementVersionAContent.class);
            if (content != null) {
                String agreementServiceCon = null;
                String agreementPrivacyCon = null;
                for (AgreementDetail detail : content.agreements) {
                    if (detail != null) {
                        if (detail.type == 1) {//服务协议
                            agreementServiceCon = detail.content;
                        } else if (detail.type == 2) {//隐私政策
                            agreementPrivacyCon = detail.content;
                        } else if (detail.type == 0) {//聚合页
                        }
                    }
                }
                Toast.makeText(mContext, "隐私政策Content:" + agreementPrivacyCon + "\n服务协议Content: " + agreementServiceCon, Toast.LENGTH_LONG).show();
            }
        }
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  • data.get("data") JSON格式说明:
{
  "agreements": [
    {
      "type": 2,
      "url": "https:\/\/sdkdl.sdoprofile.com\/ghome\/yinsizhengce.html",
      "content": "\r\n<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>隐私政策<\/tit.............. "
    },
    {
      "type": 1,
      "url": "https:\/\/sdkdl.sdoprofile.com\/ghome\/yonghuxieyi.html",
      "content": "<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>用户协议<\/tit.........."
    },
    {
      "type": 0,
      "url": "https:\/\/sdkdl.sdoprofile.com\/ghome\/ghome_union.html",
      "content": "<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>盛趣游戏用户协议和隐私政策..........."
    }
  ],
  "status": 1,
  "version": 2
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 13. 登录账号更换绑定手机号(选接)

使用第三方账号(微博,QQ,微信等)登录进游戏之后的换绑手机号功能接口

  • 接口:

    changeThirdBindPhone(Activity activity, String appId, Callback callback);

  • 参数说明:

    activity: Activity对象。

    appId: 游戏在 GPOP 上申请得到的ID。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHome.getInstance().changeThirdBindPhone(mContext, "791000008", new Callback() {
    @Override
    public void callback(int code, String message, Map<String, String> data) {
        if (code == 0) {
            Toast.makeText(mContext, "关联成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(mContext, "关联失败", Toast.LENGTH_SHORT).show();
        }
    }
});
1
2
3
4
5
6
7
8
9
10

# 14. 附录:特殊说明

  • SDK常用类所在包:

    import com.ghome.sdk.GHome;
    import com.ghome.sdk.GHomeApplication;
    import com.ghome.sdk.common.Constants;
    import com.ghome.sdk.common.IGHomeApi;
    import com.ghome.sdk.common.IGHomeApi.Callback;
    
    1
    2
    3
    4
    5
  • 域名自定义配置(sdk 内都有默认值,无特殊需要则不需要修改)

    //设置 sdk主域名
    GHome.setGUnionAuthSdkHostApiBiz("https://gunionauth.u.sdo.com");
    
    //设置 sdk 日志上报接口
    GHome.setGUnionAuthSdkHostApiLog("https://reportsk.web.sdo.com/report/ge/app");
    
    //设置 sdk 隐私协议获取接口
    GHome.setGUnionAuthSdkHostApiAgreement("https://utility.sdoprofile.com");
    
    //设置 sdk内账号注销接口域名
    GHome.setGUnionAuthSdkHostApiRevokeUrl("https://sdkdl.sdoprofile.com/ghome/ghome_revoke.html");
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
Last Updated: 6/21/2024, 2:55:07 AM