# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# GHome SDK调试日志开关
GHome.getInstance().setGHomeSDKDebuggable(true); //如果开启调试日志,发布包记得删除或设置成false关闭调试日志
# 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'
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">
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();
}
...
}
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"/>
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;
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();
}
}
});
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);
}
}
});
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);
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) {
//初始化失败 无需处理
}
}
});
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 {
//登录失败无需处理
}
}
});
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 {
// 注销失败
}
}
});
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 {
//默认是切换账号失败,无需处理
}
}
});
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 {
// 注销删除账号取消或者失败 无需处理
}
}
});
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"));
}
}
});
2
3
4
5
6
7
8
- JSON格式说明:
{
"message":[
{
"area_code":"1", // 开发商后台配置的区服ID
"name":"area1" // 开发商后台配置的区服名称
"group_id":"1" // 开发商后台配置的区组ID
"group_name":"gourp1" // 开发商后台配置的区组名称
},
...
]
}
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);
}
}
});
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");
# 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);
}
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());
# 11.1.2. 获取二级渠道号
游戏可调用以下接口来获取二级渠道号
接口:
getCPSChannelCode(Context context);
参数说明:
context 上下文(可通过getApplicationContext()获取)
代码示例:
GHome.getInstance().getCPSChannelCode(getApplicationContext());
# 11.2. 获取G家设备id
G家使用的设备id的字符串
接口:
getGHomeDeviceId(final Activity activity)
参数说明:
activity: Activity对象。
代码示例:
GHome.getInstance().getGHomeDeviceId(this)
# 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();
}
}
}
});
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();
}
}
}
});
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
}
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();
}
}
});
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