1 、简介
1.1 用户模块
提供 UI界面 和 接口调用 两种方式,满足用户不同需求。
1.1.1 登录弹窗
内置登录UI弹窗,内含所有已经集成的登录方式,无需编写界面,一键集成登录功能
1.1.2 匿名登录
WINGSDK匿名登录无需账户密码,根据设备信息新建用户或登录已存在的用户,可以快速登录游戏。
1.1.3 第三方平台登录
第三方平台登录接口可以通过第三方平台账户登录,返回WINGSDK账号信息,使用没有绑定任何WINGSDK账号的第三方平台账号登录,会自动新建一个WINGSDK账号,并且与该平台账号绑定。支持Facebook登录、Google登录、VK登录。
1.1.4 内置账户管理界面
内置账户管理UI界面,无需编写界面和逻辑,即可对账户进行管理,平台账户绑定情况一目了然,绑定、解绑平台账户,新建账号,切换账号,轻松搞定。
1.1.5 账号绑定与解绑
-
账号绑定接口,可以将WINGSDK账号跟第三方平台的账号绑定,绑定成功后可以使用绑定的平台账号登录,在同一应用中一个平台账号只能绑定一个WINGSDK账号。
-
账号解绑接口,可以将第三方平台账号与其绑定的WINGSDK账号解绑,解绑成功后,平台账号可以与WINGSDK账号再次绑定。
-
绑定账号查询接口,能够查询此时登录的账号(WINGSDK)已经绑定的第三方平台账号列表。
1.1.6 账号切换
一键切换账号,迅速切换WINGSDK账号或者第三方账号。
1.2 支付模块
支付模块提供支付充值接口,集成简单,无需理会复杂的支付流程,轻松完成商品的购买(充值)。
1.3 数据收集模块
数据收集模块提供了数据收集的接口,多渠道灵活调用。数据收集包含了丰富的应用内的事件类型,还支持用户自定义事件类型。
1.6 推送
WINGSDK推送功能,可以向客户端推送消息,通过简单几步配置即可使用。
1.8. 智能客服 AIHelp
WINGSDK智能客服功能,集成机器人、人工客服,FAQ等功能。
1.9.隐私政策
为了遵守欧盟以及Google等第三方的一些关于用户隐私的法律法规,WINGSDK实现了一套简单的用户隐私政策流程。分为两种类型,一种是自动的,针对的是对接了登录窗口方式的CP,这种情况CP无需接入任何新的接口;一种手动的,针对的是对接了接口登录的CP,这种情况CP需要对接新的接口,具体接口参考隐私政策接口章节。
1.10. 用户中心
WINGSDK用户中心功能,可以向玩家展示充值中心账号、初始密码、信息内容。
2 、快速集成
2.1 环境配置要求
2.2 集成SDK到项目
WINGSDK基于gradle提供了多种集成方式:Gradle自动集成、手动集成、Eclipse项目集成、命令行集成,可以根据需要选择其中任意一种方式。
集成参考demo: demo代码下载地址
第三方SDK依赖关系如下表
第三方SDK |
版本 |
GOOGLE |
com.android.billingclient:billing:7.1.1 com.google.android.gms:play-services-base:18.5.0 com.google.android.gms:play-services-games-v2:20.1.2 com.google.android.gms:play-services-ads-identifier:18.2.0 com.google.gms:google-services:4.4.2 com.google.android.play:review:2.0.2 androidx.credentials:credentials:1.3.0 androidx.credentials:credentials-play-services-auth:1.3.0 androidx.credentials:credentials-play-services-auth:1.3.0 com.google.android.libraries.identity.googleid:googleid:1.1.1 com.google.android.gms:play-services-auth:21.3.0 |
Google Firebase |
com.google.firebase:firebase-analytics:22.2.0 com.google.firebase:firebase-messaging:24.1.0 |
FACEBOOK |
18.0.0 |
APPSFLYER |
6.16.0 |
AIHELP |
5.4.0 |
glide |
4.11.0 |
华为HMS |
com.huawei.hms:hwid:6.7.0.300 com.huawei.hms:iap:6.4.0.301 com.huawei.hms:hianalytics:6.8.0.300 com.huawei.agconnect:agconnect-crash:1.7.2.300 com.huawei.agconnect:agconnect-apms:1.6.1.303 com.huawei.hms:ads-identifier:3.4.56.300 |
AdMob |
com.google.android.gms:play-services-ads:23.0.0 com.google.android.ump:user-messaging-platform:2.2.0 |
Nowgg |
com.wa.3rd:com-nowgg-sdk:3.0.0@aar |
Leidian |
com.ld.android:ld-sdk:2.9.0 |
2.2.1 Gradle自动集成
新项目配置:在项目目录下的settings.gradle文件添加以下配置:
|
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() //这里是新增的maven地址,内部声明支持http请求 maven { allowInsecureProtocol = true url "http://repo.wingsdk.cn:8081/repository/winga-group/" } } } |
旧项目配置:在项目目录下的build.gradle文件添加以下配置:
|
apply plugin: 'maven' allprojects { repositories { jcenter() maven { allowInsecureProtocol= true url "http://repo.wingsdk.cn:8081/repository/winga-group/" } } } |
注意:
1)部分项目中可能只有一个build.gradle文件;
2)以上的url为WingSdk仓库地址:http://repo.wingsdk.cn:8081/repository/winga-group/
在程序module下面的build.gradle文件的dependencies内增加依赖配置;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
// 基础模块(必选) implementation 'com.wa.sdk:wa-sdk-base:x.x.x' // 核心模块(必选) implementation 'com.wa.sdk:wa-sdk-core: x.x.x' // Firebase模块(必选) implementation 'com.wa.sdk:wa-sdk-firebase: x.x.x' // AppsFlyer模块(可选) implementation 'com.wa.sdk:wa-sdk-appsflyer: x.x.x' // Facebook模块(可选) implementation 'com.wa.sdk:wa-sdk-facebook: x.x.x' // Google模块(可选) implementation 'com.wa.sdk:wa-sdk-google: x.x.x' // GHGL集成登录,GHG和R2平台 (可选) implementation 'com.wa.sdk:wa-sdk-ghgl:x.x.x' // GHGP网页支付模块(可选,如果需要第三方支付则需要添加此模块) implementation 'com.wa.sdk:wa-sdk-ghgp: x.x.x' // WA AIHelp模块(可选) implementation 'com.wa.sdk:wa-sdk-aihelp:x.x.x' // 华为HMS模块(可选) implementation 'com.wa.sdk:wa-sdk-huaweihms:x.x.x' |
注意:
1)部分项目中可能只有一个build.gradle文件;
2)以上的“必选”项目必须引入,“可选”项目可根据需求引入。
3) 其中x.x.x为各个模块的具体版本号,随SDK版本升级会发生改变,各个版本对应的渠道包版本请参考:https://admin.wingsdk.com/developers/pack_config.do 在这个地址页面,也可以通过选择版本和所需要的渠道,一键生成依赖脚本配置。
2.3 SDK配置及初始化
2.3.1 SDK配置
2.3.1.1 AndroidManifest.xml配置:
在AndroidManifest.xml中application标签下添加以下设置。不同的应用配置的参数值不相同,需要申请相应资源。
|
<!-- sdk的appid --> <meta-data android:name="com.wa.sdk.APP_ID" android:value="f7f9a9d18da611e5a0be000d3a906774" /> <!-- sdk的appkey --> <meta-data android:name="com.wa.sdk.APP_KEY" android:value="CFHF7nQCCaojCX6Sm4eT1GEIWRprimgX" /> —-- sdk平台请求的host地址,所有请求的前面公共部分 --> <meta-data android:name="com.wa.sdk.HTTP_BASE_URL" android:value="https://api.wingsdk.com/sdkapi" /> <!-- 数据收集请求地址 --> <meta-data android:name="com.wa.sdk.track.BASE_URL" android:value="https://api.wingsdk.com/data"/> |
注意:以上配置中android:name必须保持一致,android:value根据CP应用申请的资源而定。
2.3.1.2 Activity结果传递配置
在所有使用到SDK接口的Activity的onActivityResult方法中增加以下代码:
|
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (WACommonProxy.onActivityResult(requestCode, resultCode, intent)) { return; } super.onActivityResult(requestCode, resultCode, intent); } |
2.3.1.3 接口使用注意事项
1.所有SDK接口都必须在主线程中调用
2.所有SDK接口必须在SDK初始化成功后调用,除非有特殊说明
2.3.2 SDK初始化
调用下面接口对SDK进行初始化:
|
WACoreProxy.initialize(final Activity activity, final WACallback<Void> callback); |
注意:
1.SDK初始化必须在第一个Activity的onCreate()方法中调用,必须在UI线程中调用。
2.从回调中获取初始化结果,所有SDK接口都必须在SDK初始化成功的情况下才能调用。
3.建议在初始化中过程中增加laoding状态,返回结果后再关闭loading
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
调用接口的Activity |
|
callback |
WACallback |
Y |
初始化结果回调 |
1)onSuccess 初始化成功 2)onError 初始化失败 |
示例代码:
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
|
// 显示loading showLoading(); // SDK初始化 WACoreProxy.initialize(this, new WACallback<Void>() { @Override public void onSuccess(int code, String message, Void result) { // 隐藏loading HideLoading(); // 初始化成功,可以调用SDK其他接口,以及进入游戏 doSomeThing(); } @Override public void onCancel() { // 忽略,无需处理 } @Override public void onError(int code, String message, Void result, Throwable throwable) { // 隐藏loading HideLoading(); // 初始化失败,提示退出应用重新进入,或者提供界面操作让用户重试 showTipsExitOrRetry(); } } |
2.4 登录
如果用户进入游戏时的界面无登录按钮,则需要添加。当用户关闭登录窗口后可以通过登录按钮重新拉起登录窗口,具体位置和图标由运营决定。效果参考下图

2.4.1 使用登录窗口
2.4.1.1 调用登录窗口
注意:测试时,需要联系运营添加测试设备,才能出现登录方式。
SDK内置了一个包含所有支持的登录方式的一个对话框,通过调用以下接口显示对话框:
|
WAUserProxy.loginUI(Activity activity, boolean enableCache, WACallback<WALoginResult> callback) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
调用接口的Activity |
|
enableCache |
boolean |
Y |
是否启用登录缓存,true为启用,false为关闭 一般建议传true |
如果开启登录缓存,那么调用这个接口的时候会看是否有登录记录,如果有,不会显示登录方式选择对话框,直接使用上一次的登录方式登录。 |
callback |
WACallback<WAloginResult> |
N |
回调,用来返回登录结果 |
处理登录结果 |
注意:使用登录窗口时,点击图标登录SDK自动弹出加载框,无需再次添加加载框。
2.4.1.2 清除登录窗口的缓存
使用登录窗口对话框进行登录,如果启用了缓存,SDK会缓存当前登录方式,下一次在启用缓存的前提下使用登录窗口登录,会自动使用上一次登录方式登录,不再弹出登录窗口。清除掉缓存后,可以重新弹出登录窗口,清除缓存调用以下接口:
|
WAUserProxy.clearLoginCache(); |
注意:从3.18.0开始,调用WAUserProxy.logout()时,内部已经包含清除登录窗口缓存逻辑,可以不调用该方法。
2.4.2 使用接口登录
如果CP有自己的登录窗口,可以使用以下登录接口:
|
WAUserProxy.login(Activity activity, String platform,WACallback<WALoginResult> callback, String extra) |
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
调用接口的Activity |
|
platform |
String |
Y |
登录账户的平台类型 |
在WAConstants类中定义,详情请看平台取值 |
callback |
WACallback<WAloginResult> |
N |
回调,用来返回登录结果 |
处理登录结果 |
extra |
String |
N |
额外信息 |
Facebook自定义权限登录、应用内登录等高级登录设置请参考登录高级设置相关章节 |
2.4.3 处理登录结果
登录结果通过传入的回调返回,数据封装在WALoginResult类中。
WALoginResult字段说明
字段名 |
类型 |
说明 |
备注 |
code |
int |
登录结果码 |
状态码说明 |
message |
String |
登录结果消息 |
|
userId |
String |
WINGSDK用户id |
|
token |
String |
WINGSDK用户token |
|
platformUserId |
String |
平台用户id |
|
platformToken |
String |
平台用户token |
|
platform |
String |
平台类型 |
当前登录的平台名称 |
isGuestAccount |
int |
是否游客登录 |
0 不是游客账号 1是游客账号 |
2.4.4 用户登出
需需要在游戏中添加该功能入口,一般是在游戏设置页中,具体入口位置和图标由运营决定。效果参考下图:

用户正常关闭游戏时无需调用该接口,只有在退出游戏账号的时,才必须执行登出操作。用户登出调用以下接口:
注意:调用logout接口后,serverId、gameUseId、level字段值会被重置,如果需要保持相应字段的值不重置,需要重新设置相应字段的值,参考 公共参数设置
2.5 支付
WINGSDK支付流程如下:

2.5.1 初始化支付
初始化支付,SDK会对所有已经支持的支付平台做初始化,初始化调用接口
建议在SDK初始化成功后立即调用。
|
WAPayProxy.initialize(Context context, WACallback<WAResult> callback) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
context |
Context |
Y |
Context对象 |
|
callback |
WACallback<WAResult> |
N |
回调方法,返回初始化结果 |
初始化成功才能使用支付 |
2.5.2 查询库存商品列表
通过查询库存商品列表,可以获取所有可以购买的库存商品,查询库存调用接口
|
WAPayProxy.queryInventory(WACallback<WASkuResult> callback) |
注意:这里返回的库存商品信息是WINGSDK平台的商品信息,并非第三方平台的商品信息。
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
callback |
WACallback<WASkuResult> |
N |
回调方法,结果返回 |
|
WASkuDetails实体类说明:
get方法名 |
返回值类型 |
不为空 |
说明 |
备注 |
getSku() |
String |
Y |
库存商品id |
|
getTitle() |
String |
N |
商品名称 |
|
getDescription() |
String |
N |
商品描述 |
|
getVirtualCoinAmount() |
long |
Y |
虚拟货币数 |
|
2.5.3 购买商品
购买指定商品,调用以下接口发起支付:
|
WAPayProxy.payUI(Activity activity, String waProductId, String extInfo, WACallback<WAPurchaseResult> callback) |
调用支付接口支付将会出现两种情况:
1)直接弹出google购买窗口(如果该商品有且只有google支付渠道);
2)弹出支付渠道选择窗口(如果有除google之外的渠道),选择支付方式后进行支付。
注意:如果需要在订单信息中记录当前玩家昵称,需要按设置玩家昵称设置玩家昵称。
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
调用Activity |
|
waProductId |
String |
Y |
WINGSDK 商品的id |
必须WINGSDK 平台的商品id |
extInfo |
String |
N |
额外信息,该信息会在支付成功后原样通知到CP服务器,CP用于检验 |
CP 扩展信息字段,限长512(JSON格式),WING服务器到CP服务器发货通知时原样返回给CP。如果CP的通知发货地址是动态变化的(比如每个服务区的地址都不一致),可以通过此字段设置:参数格式为标准JSON,参数名为 deliverUrl,参考格式 { “deliverUrl”:” http://game.com/deliver.do”, “otherInfo”:”otherInfo”, “merId”:”” } merId字段(选填),收款商户ID,使用场景:同一个支付渠道下有多个不同的收款验证信息(或收款帐号)。如果是 APPLE支付渠道,merId使用客户端bundleId |
callback |
WACallback< WAPurchaseResult > |
N |
回调方法,结果返回 |
|
注意:如果需要横竖屏适配,请在AndroidMainifest.xml中对弹出购买窗口的Activity声明中添加如下语句:
|
android:configChanges="keyboardHidden|screenSize|orientation" |
WAPurchaseResult实体类说明:
Get方法名 |
返回值类型 |
不为空 |
说明 |
备注 |
getPlatform() |
String |
Y |
支付平台 |
|
getWAProductId() |
String |
Y |
WINGSDK商品id |
|
getExtInfo() |
String |
N |
额外数据 |
支付的时候CP传入的 |
getOrderId() |
String |
N |
WINGSDK订单号 |
部分支付方式没有 |
getPlatformOrderId() |
String |
N |
第三方平台订单号 |
部分支付方式没有 |
getSku() |
String |
N |
第三方平台商品id |
|
getPriceCurrencyCode() |
String |
N |
本地货币类型 |
|
getPriceAmountMicros() |
long |
N |
本地货币数量 |
微分,1元=1000000 |
getDefaultCurrency() |
String |
N |
基准货币类型 |
|
getDefaultAmountMicro() |
long |
N |
基准货币数量 |
微分,1元=1000000 |
getVirtualCurrency() |
String |
N |
虚拟货币类型 |
|
getVirtualCoinAmount() |
long |
Y |
虚拟货币数量 |
|
2.6 数据收集
使用WINGSDK数据收集接口配合大数据平台,可以轻松统计玩家习惯以及充值等行为,为游戏的市场营销提供数据依据。WINGSDK数据收集使用在游戏的过程中打点的方式,如图所示:

- 以上流程图中涉及到的几个接口是有时序要求的,请参考流程图中的逻辑步骤进行设置:ghw_user_import事件、ghw_user_create事件
- 其它的事件如ghw_level_achieved、ghw_self_tutorial_completed、ghw_self_lv_x等请根据对应业务逻辑,在对应业务发生时调用接口发送
序号 |
事件(接口)名称 |
事件描述 |
事件作用 |
1 |
ghw_user_import |
玩家登录游戏服 |
记录玩家登录游戏服的动作,后台根据该事件统计导入数、登录数、导入留存等数据 |
2 |
ghw_user_create |
玩家创建角色 |
记录玩家创建角色的动作,后台根据该事件统计创角数 |
3 |
ghw_initiated_purchase |
玩家点击购买 |
点击购买事件 。调用时机:用户点击购买时调用 |
4 |
ghw_level_achieved |
更新玩家等级 |
更新玩家等级,后台根据此字段更新玩家等级 |
5 |
ghw_self_lv_x |
更新玩家关键等级 |
更新玩家关键等级,如ghw_self_lv_3、ghw_self_lv_5 |
6 |
ghw_user_info_update |
更新用户信息 |
更新用户信息 |
7 |
ghw_self_tutorial_completed |
完成新手任务 |
标记玩家完成新手任务 |
2.6.1.常用事件对象对照表
参数名 |
对象类 |
说明 |
ghw_user_import |
WAUserImportEvent |
用户进服事件。 调用时机:玩家登录游戏服务器成功后 |
ghw_user_create |
WAUserCreateEvent |
用户创角事件。 调用时机:玩家创建角色成功后调用 |
ghw_user_info_update |
WAUserInfoUpdateEvent |
更新用户信息。 调用时机:玩家更改角色昵称时(必须),或信息更新时(可选) |
ghw_level_achieved |
WALevelAchievedEvent |
等级增长事件。 调用时机:玩家达到新的等级时调用) |
ghw_initiated_purchase |
WAInitiatedPurchaseEvent |
点击购买事件 。 调用时机:用户点击购买时调用 |
ghw_self_lv_x |
WALvXEvent |
关键等级 ,具体等级由运营确定 调用时机:玩家达到关键等级时调用 |
ghw_self_tutorial_completed |
WATutorialCompletedEvent |
完成新手任务。具体等级由运营确定 触发时机:完成新手任务时调用 |
2.6.2 常用事件发送
常用事件已经内置setServerId,setGameUserId,setNickname,setLevel,正常调用这些事件后,无需再额外调用上面接口。
2.6.2.1 ghw_user_import用户进服
事件说明:用户进服事件
调用时机:玩家登录游戏服务器成功后
参数名 |
类型 |
说明 |
必填 |
备注 |
serverId |
String |
服务器ID |
Y |
|
gameUserId |
String |
游戏角色ID |
Y |
如果未创角,可以设置为“-1” |
nickname |
String |
游戏角色名(昵称) |
Y |
如果未创角,可以设置为空 |
level |
int |
游戏角色等级 |
Y |
|
serverId |
String |
服务器ID |
Y |
|
isFirstEnter |
int |
是否第一次进服 |
Y |
|
代码示例
|
String serverId = "1"; // 服务器ID String gameUserId = "1000229"; // 游戏角色ID,如果未创角可以设置为“-1” String nickName = "Lucy"; // 游戏角色昵称,如果未创角可以设置为空 int level = 1; // 游戏角色等级 boolean isFirstEnter = false; // 是否首次进服 WAUserImportEvent event = new WAUserImportEvent(serverId, gameUserId, nickName, level, isFirstEnter); WATrackProxy.trackEvent(context, event); |
2.6.2.2 ghw_user_create用户创角
事件说明:用户创角事件
调用时机:玩家创建角色成功后调用
事件参数
参数名 |
类型 |
说明 |
必填 |
备注 |
serverId |
String |
服务器ID |
Y |
|
gameUserId |
String |
游戏角色ID |
Y |
|
nickname |
String |
游戏角色名(昵称) |
Y |
|
registerTime |
long |
创角时的时间戳 |
Y |
单位为毫秒(1970以后),长度13位 |
roleType |
String |
角色类型 |
N |
|
gender |
int |
角色性别 |
N |
0 女 1 男 2 未知 |
vip |
int |
等级 |
N |
|
bindGameGold |
int |
绑定钻石数 |
N |
|
gameGold |
int |
用户钻石数 |
N |
|
fighting |
int |
战斗力 |
N |
|
status |
int |
状态 |
N |
状态标识 -1: 锁定, 1:未锁定 |
代码示例
|
String serverId = "1"; // 服务器ID String gameUserId = "1000229"; // 游戏角色ID String nickName = "Lucy"; // 游戏角色昵称 long registerTime = System.currentTimeMillis(); // 角色创建时间 WAUserCreateEvent event = new WAUserCreateEvent(serverId, gameUserId, nickName, registerTime); // 可选 // event.setRoleType("射手"); // event.setGender(0); // event.setVip(10); // event.setBindGameGold(99); // event.setGameGold(999); // event.setFighting(45427); // event.setStatus(false); WATrackProxy.trackEvent(context, event); |
2.6.2.3. ghw_user_info_update 更新用户信息
事件说明:更新用户信息。
调用时机:玩家更改角色昵称时(必须),或信息更新时(可选)
参数名 |
类型 |
说明 |
必填 |
备注 |
nickname |
String |
游戏角色名(昵称) |
Y |
|
roleType |
String |
角色类型 |
N |
|
vip |
int |
等级 |
N |
|
status |
int |
状态 |
N |
状态标识,-1:锁定,1:未锁定 |
代码示例:
|
String nickname = "Lucy"; // 角色昵称 WAUserInfoUpdateEvent event = new WAUserInfoUpdateEvent(nickname); // 可选 // event.setVip(10); // vent.setRoleType("射手"); // vent.setStatus(false); WATrackProxy.trackEvent(context, event); |
2.6.2.4 ghw_level_achieved 等级增长事件
事件说明:等级增长事件。
调用时机:玩家达到新的等级时调用
参数名 |
类型 |
说明 |
必填 |
备注 |
currentLevel |
int |
当前等级 |
Y |
|
score |
int |
账户分数 |
N |
|
fighting |
int |
战斗力 |
N |
|
|
int currentLevel = 12; // 当前等级 WALevelAchievedEvent event = new WALevelAchievedEvent(currentLevel); // 可选 // event.setFighting(45427); // event.setScore(1025456); WATrackProxy.trackEvent(context, event); |
2.6.2.5 ghw_initiated_purchase点击购买
事件说明:点击购买事件 。
调用时机:用户点击购买时调用
事件参数:无
代码示例
|
WAInitiatedPurchaseEvent event = new WAInitiatedPurchaseEvent(); WATrackProxy.trackEvent(context, event); |
2.6.2.7.ghw_self_lv_x关键等级
事件说明:关键等级,具体等级由运营确定
调用时机:玩家达到关键等级时调用
事件参数:
参数名 |
类型 |
说明 |
必填 |
备注 |
level |
int |
关键等级 |
Y |
由运营确定 |
参考示例:
|
int level = 12; // 关键等级 WALvXEvent event = new WALvXEvent(level); WATrackProxy.trackEvent(context, event); |
2.6.2.8.ghw_self_tutorial_completed完成新手任务
事件说明:完成新手任务。
触发时机:完成新手任务时调用
无参数
参考示例:
|
WATutorialCompletedEvent event = new WATutorialCompletedEvent(); WATrackProxy.trackEvent(context, event); |
2.7 代码混淆配置
打包apk混淆代码配置中增加以下配置
|
-keepattributes SourceFile,LineNumberTable -dontwarn com.google.** -dontwarn android.support.** -dontwarn com.squareup.** -keep class com.wa.sdk.** { *; } -keep class android.support.** { *; } -keep class com.squareup.** { *; } -keep class * extends android.app.Activity { *; } -keep class * extends android.content.BroadcastReceiver { *; } -keep class **.R$* { *; } -keep class com.bumptech.glide.** {*;} |
3 、高级功能
3.1 调试模式
3.1.1 开启/关闭调试模式
SDK默认是关闭调试模式的,开启调试模式可以在IDE的Logcat中查看到程序的Log信息,方便调试和测试。开启/关闭调试模式调用以下接口。
|
WACoreProxy.setDebugMode(true); |
说明:调用此接口后即可显示Log悬浮窗按钮,不用再另外调用enableLogcat接口,同时如果需要,也可以调用disableLogcat接口隐藏Log按钮。
3.1.1.1 向Logcat增加一条日志
通过以下接口,开发者可以向Logcat工具中增加一条开发日志,日志会在Logcat工具的Log标签中显示。
|
WACommonProxy.log(String tag, String msg) |
3.1.2 如何获取 client_id
在日志中,搜索警告级别日志内容 “clientid=”,可以得到appId和clientId

3.2 账户管理
3.2.1 内置账户管理界面
需需要在游戏中添加该功能入口,一般是在游戏设置页中,具体入口位置和图标由运营决定。效果参考下图:

SDK内置了账户管理界面,在这个界面可以对账户进行管理操作,包括账号绑定、解绑、切换账户、新建账户。
|
WAUserProxy.openAccountManager(Activity activity, WAAccountCallback callback) |
注意:使用内置账户管理界面之前必须先登录
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
Activity对象 |
|
callback |
WAAccountCallback |
N |
回调 |
onLoginAccountChanged(WALoginResult currentAccount)回调方法,在新建账号、账号切换时会回调这个方法,返回当前登录的账号信息。游戏需要回到登录界面,然后可以直接使用最新的账号信息完成游戏登录,无需重新走SDK登录过程,也可以重新自动走一遍SDK登录. onBoundAccountChanged(boolean binding, WABindResult result)回调方法,在绑定账户信息发生变更时会回调这个方法,每次变更都调用一次,CP可根据需要实现相应功能。如绑定账号发放奖励. |
onBoundAccountChang方法参数说明:
参数名 |
类型 |
取值 |
备注 |
binding |
boolean |
true或false |
true说明本次回调是账号绑定操作,false说明本次回调是账号解绑操作 |
WABindResult |
WABindResult |
WABindResult |
绑定或解绑结果,具体包含属性参考下方WABindResult字段说明 |
WABindResult方法参数说明:
参数名 |
类型 |
取值 |
备注 |
code |
int |
状态码 |
200为成功,其他为错误码 |
message |
String |
状态消息 |
|
platform |
String |
平台 |
在WAConstants类中定义,详情请看 平台取值 |
accessToken |
String |
平台token |
|
platformUserId |
String |
平台user id |
|
参考示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
WAUserProxy.openAccountManager(this, new WAAccountCallback() { @Override public void onLoginAccountChanged(WALoginResult currentAccount) { Log.d("test", "登录的账号发生变更(SDK已切换到另一个账号,或登录到新账号),当前新的登录的账号信息:"+currentAccount.toString()); // 游戏需要回到登录界面,然后可以直接使用最新的账号信息完成游戏登录,无需重新走SDK登录过程,也可以重新自动走一遍SDK登录 } @Override public void onBoundAccountChanged(boolean binding, WABindResult result) { Log.d("test", "在绑定账户信息发生变更(SDK绑定或解绑其他平台账号成功),"+(binding?"绑定":"解绑")+"账号信息:"+result.toString()); // 用户完成账号绑定,或解绑。如果需要绑定账号发奖励,可以在这里处理 } @Override public void onRealNameAuthChanged(WAResult<WACertificationInfo> waResult) { // 忽略,无需处理 } }); |
3.3 Firebase
原来的push模块更改为Firebase模块。Firebase为3.9.3及之后版本必须接入的模块。
Firebase包含推送通知及统计分析(包括事件跟踪)功能。
温馨提示:WINGSDK当前版本的推送是基于Firebase实现,国内环境需要VPN才能使用。
3.3.2 集成配置
3.3.2.1 将WINGSDK推送模块集成到项目
添加推送模块依赖方法参考 集成SDK到项目
添加依赖后,在项目(Project)的build.gradle文件中添加依赖
|
buildscript { dependencies { // 提示: 不要替换原来的dependencies,将下面的内容放进原有的下面即可 classpath 'com.google.gms:google-services:4.4.2' } } |
在项目模块(Module)的build.gradle文件中添加插件声明(将这一句添加到build.gradle文件的最低端, 没有添加推送模块的依赖,不要添加这句 )
|
// 将这一句添加到build.gradle文件的最底端, 没有添加推送模块的依赖,不要添加这句 apply plugin: 'com.google.gms.google-services' |
3.3.3 Android 13运行时通知权限申请
以Android 13为目标的应用项目,需要在恰当的时机(建议在用户进服后)申请通知权限,否则新安装应用无法接收Firebase通知
示例代码:
|
// 建议在玩家进服后进行权限申请 if (Build.VERSION.SDK_INT >= 33) { //使用SDK的权限接口向用户申请通知权限,该权限不要求用户必须授权,参数按照下面传入false不强制,和null无弹窗提示语即可 WACommonProxy.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS, false, null, null, null); }else { //系统低于 Android 13 无需授权通知权限 } |
3.4 智能客服 AIHelp
需要在游戏中添加该功能入口,一般是在游戏登录页和设置页中,具体入口位置和图标由运营决定。效果参考下图:

3.4.1. 判断是否开启AiHelp
|
WACscProxy.isOpenAiHelp(); |
说明:该接口返回布尔值,true表示已开启,false表示未开启。在使用其他AIHELP接口前请先判断这个接口,在返回true的情况下使用。示例如下:
|
if (WACscProxy.isOpenAiHelp()) { WACscProxy.openAiHelpV2(); } |
3.4.2. 展示AiHelp后台配置界面
|
WACscProxy.openAiHelpV2(); |
说明:该接口受WING后台中”SDK客服开关V2”控制。如果后台未开启开关,此接口不生效。
3.4.3.获取未读消息数
调用下面接口获取未读消息数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// 建议每次进入AiHelp客服入口所在页面都调用一次,更新客服入口红点状态。 //比如用户每次进入游戏登录页,和每次进入游戏设置页时更新AiHelp客服红点状态 WACscProxy.getUnreadMessageCount(new WACallback<Integer>() { @Override public void onSuccess(int code, String message, Integer result) { LogUtil.e("test", "未读消息数:" + result); // 若 result>0 则需要显示未读红点,否则隐藏未读红点 } @Override public void onCancel() { } @Override public void onError(int code, String message, Integer result, Throwable throwable) { LogUtil.e("test", "获取失败:" + code + " - " + message); } }) // 另外当用户点击AiHelp打开客服时,需要移除红点 mAiHelpRedDot.setVisibility(View.INVISIBLE); |
AiHelp客服红点处理建议:
1.为了确保红点状态准确性每次进入AiHelp客服入口所在页面都调用一次该接口,更新AiHelp客服入口的红点状态。比如每次进入游戏登录页,每次进入设置页,都需要调用该接口更新红点状态。
2.当用户点击AiHelp打开客服时,需要移除红点
关于客服入口不同用户说明:
目前游戏放置的AiHelp入口一般有两个,分别在游戏登录页(未进入游戏),和游戏内(一般是设置页),比如下图。
由于AiHelp客服机制限制,在进服前,和进服后的AiHelp客服用户是不一样的,所以他们获取到的未读消息数也是不一样的。
如果研发接入时,在两个位置都有放置AiHelp入口,则两个地方都要分别去获取各自的未读消息数。


3.5 用户中心(充值中心账号信息)
需要在游戏中添加该功能入口,一般是在游戏登录页和设置页中,具体入口位置和图标由运营决定。效果参考下图:

游戏后台、运营需要如何操作, 参考
3.5.1.获取用户中心数据接口
需要在用户进服之后再调用该接口。
|
WAUserProxy.getUserCenterNotice(Activity activity,WACallback<WAShortUrlResult> callback) |
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
// 在用户进服之后调用该接口获取 Character ID WAUserProxy.getUserCenterNotice(activity,new WACallback<WAShortUrlResult>() { @Override public void onSuccess(int code, String message, WAShortUrlResult result) { //通过 result.getCharacterId() 获取充值中心Character ID,其他数据查看 WAShortUrlResult类说明 showShortToast(result.getCharacterId()); } @Override public void onCancel() { } @Override public void onError(int code, String message, WAShortUrlResult result, Throwable throwable) { showShortToast(message); } }); |
3.5.2.显示用户中心弹窗
|
WAUserProxy. showUserCenterNoticeUI(Activity activity,, WACallback<WAShortUrlResult> callback) |
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
WAUserProxy.showUserCenterNoticeUI(activity, new WACallback<WAShortUrlResult>() { @Override public void onSuccess(int code, String message, WAShortUrlResult result) { // 此方法不会被调用 } @Override public void onCancel() { showShortToast("窗口关闭"); } @Override public void onError(int code, String message, WAShortUrlResult result, Throwable throwable) { showShortToast(message); } }); |
结果通过传入的回调返回,数据封装在WAShortUrlResult类中。
WAShortUrlResult字段说明
字段名 |
类型 |
说明 |
备注 |
code |
int |
登录结果码 |
登录结果码 |
message |
String |
错误信息 |
|
info |
String |
用户中心文字内容 |
|
characterId |
String |
充值中心Character ID |
|
uid |
String |
用户ID |
|
3.6 Android6.0 权限管理
buildVersion 在23以下版本,只需要在AndroidManifest.xml中配置权限即可,buildVersion 在23及以上版本,在AndroidManifest.xml中配置的敏感权限声明,当程序运行在API 23(android6.0)及以上的系统时,授权声明是无效的,敏感权限需要在程序运行时授权。
SDK提供了运行时权限的检查与授权接口,在程序运行时,调用以下接口进行权限自检:
|
WACommonProxy.checkSelfPermission(@NonNull ctivity activity, @NonNull String permission, boolean forceRequest, String denyConfirmMsg, String permissionSettingMsg, WAPermissionCallback callback) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
Activity对象 |
|
permission |
String |
Y |
权限名称 |
权限全称字符串,参考android.Manifest.permission |
forceRequest |
boolean |
Y |
是否强制申请权限 |
true 强制申请 false非强制申请 这个参数决定权限申请流程。强制申请权限时,拒绝后会弹出确认对话框,如果拒绝且勾选不再询问时,调用接口检查权限时会要求到设置中打开权限;非强制申请权限时,拒绝授权不再弹任何对话框,下一次调用接口权限继续弹出授权对话框 |
denyConfirmMsg |
String |
N |
拒绝授权确认对话框的消息文字 |
拒绝授权后弹出确认对话框的消息文字 |
permissionSettingMsg |
String |
N |
提示跳转到设置页面打开权限对话框的消息文字 |
拒绝且勾选不再询问时,调用接口检查权限时弹出要求到设置中打开权限对话框中显示的消息文字 |
callback |
WAPermissionCallback |
N |
回调 |
接收返回的授权结果,CP根据授权结果做相应操作 |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
// 用户拒绝权限申请后弹窗显示的文案。强制申请为false时,不会有提示,可以传null String denyConfirmMsg = "如果您不允许游戏访问位置,您将无法使用 xxx 功能"; // 用户拒绝权限申请并勾选不再询问后,弹出要求到设置中打开权限对话框中显示的消息文字。强制申请为false时,不会有提示,可以传null String permissionSettingMsg = "游戏需要获取您的位置来使用 xxx 功能,请在设置中开启位置权限"; WACommonProxy.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION, true, denyConfirmMsg, permissionSettingMsg, new WAPermissionCallback() { @Override public void onCancel() { // TODO 取消授权 } @Override public void onRequestPermissionResult(String[] permissions, boolean[] grantedResults) { // TODO 处理授权结果,判断是否通过授权 } }); |
在调用上面权限自检接口的Activity中的onRequestPermissionsResult()方法中调用已下接口,完成权限自检和授权的传递。
|
WACommonProxy.onRequestPermissionsResult(Activity activity, int requestCode, String[] permissions, int[] grantResults) |
示例:
|
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); WACommonProxy.onRequestPermissionsResult(this, requestCode, permissions, grantResults); } |
3.7 游戏评价窗口
游戏评价窗口用于向用户展示评分提示窗口,弹出后用户可以选择提交好评(即拉起Google评分),或我要提意见(即打开AiHelp),或不谢谢(即关闭窗口,手势返回关闭同这个操作一样),具体UI可以查看后面的效果图。
|
WAUserProxy.openGameReview(Activity activity, WAGameReviewCallback callback) |
注意:
1.如果需要评价完成给用户发放奖励,可以在onReviewComplete回调中进行处理
2.该功能受WingSDK后台开关控制,需要打开游戏评价开关
3.评分功能是无法获得具体评分内容和分值的,Google评分机制设计如此
4.关于Google评分的详情及测试 google 应用内评分
5.如果不需要SDK界面,另外单独做界面,可以分别调用Google评分接口google 应用内评分 (对应好评选项)和AiHelp游戏评价接口打开游戏评价客服入口 (对应吐槽选项)
示例代码:
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
|
WAUserProxy.openGameReview(this, new WAGameReviewCallback() { @Override public void onError(int code, String message) { String text = "打开游戏评价失败:" + code + "," + message; Log.d(WAConstants.TAG,text); } @Override public void onReject() { String text = "游戏评价结果:不,谢谢!"; Log.d(WAConstants.TAG,text); } @Override public void onOpenAiHelp() { String text = "游戏评价结果:我要提意见"; Log.d(WAConstants.TAG,text); } @Override public void onReviewComplete() { String text = "游戏评价结果:提交好评"; Log.d(WAConstants.TAG,text); // 如果需要评价完成给用户发放奖励,可以在这里进行处理 } }); |
界面效果:

3.8 账号注销
需要在游戏中添加该功能入口,一般是在游戏设置页中,具体入口位置和图标由运营决定。效果参考下图:

3.8.1 UI版本
sdk内部已经完成了完整流程的UI展示,以及请求接口操作,CP只需要调用即可。
|
WAUserProxy.requestDeleteAccountUI(Activity activity, WACallback<WAResult> callback) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
Activity对象 |
|
callback |
WACallback< WAResult> |
N |
回调方法,结果返回 |
|
示例代码:
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
|
WAUserProxy.requestDeleteAccountUI(UserDeletionActivity.this, new WACallback<WAResult>() { @Override public void onSuccess(int code, String message, WAResult result) { Log.d("","申请账号注销成功!\nCP需要退出sdk,然后再退出游戏到登录页"); // 退出sdk内部的登录 WAUserProxy.logout(); // 退出游戏到登录页面 ... } @Override public void onCancel() { // 取消 } @Override public void onError(int code, String message, WAResult result, Throwable throwable) { // 失败 showShortToast("error:" + code + " , " + message); } }); |
横屏效果如下:

3.9 Consent同意屏幕相关
3.9.1 同意通知ID配置
在AndroidManifest.xml中添加下面代码,其中xxx为同意通知ID,具体值从运营处获取
|
<meta-data android:name="com.wa.sdk.CONSENT_NOTICE_ID" android:value="xxx" /> |
3.9.2 用户同意界面显示
用户同意界面弹出是内置在SDK初始化逻辑中,当SDK正常初始化完成后,如果需要符合弹出条件,就会展示用户同意界面。
以下情况不会弹出:
1.不在生效地区(一般指欧盟)
2.用户已经在同意界面操作过同意或拒绝
注意:初始化时传入的Activity类型,必须是FragmentActivity,否则同意屏幕无法初始化。
展示效果:
了解更多,会跳转到目的设置页,页面效果参考同意设置。
管理我们的x合作伙伴,会跳到 供应商设置页,页面效果参考同意设置。

3.9.3 打开同意设置
1.需要在游戏中添加该功能入口,一般是在游戏登录页和设置页中,具体入口位置和图标由运营决定。效果参考下图:

2.使用WACmpProxy.checkConsentPreferences(WACallback callback)方法来控制同意设置按钮的显示和隐藏。如果不在生效地区(一般指欧盟),回调结果会返回false,此时应该隐藏按钮,否则返回true则需要显示。
参考以下示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
WACmpProxy.checkConsentPreferences(new WACallback<Boolean>() { @Override public void onSuccess(int code, String message, Boolean isShow) { // 返回 true,在生效地区(欧盟),需要显示 Consent同意设置 按钮;返回false,不在生效地区,则隐藏; } @Override public void onCancel() { // 忽略,无需处理 } @Override public void onError(int code, String message, Boolean result, Throwable throwable) { // 忽略,无需处理 } }); |
3.用户点击入口按钮时调用下面接口打开同意设置界面
|
WACmpProxy.showConsentPreferences(FragmentActivity activity) |
目的同意设置页,和供应商同意设置页,展示效果:


3.10 AdMob功能
3.10.1 应用ID配置
在AndroidManifest.xml的application标签下添加下面代码,其中xxx为AdMob的应用ID,具体值从运营处获取
|
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="xxx"/> |
3.10.2 设置测试状态
注意:只有在PlayStore上下载的应用才允许播放生产环境广告,否则可能会因违反AdMob协议而封停账号。
为了确保在本地测试时播放的是测试广告,需要在SDK初始化之前调用该接口传入true,在打线上包时才改为传入false。
|
WAAdMobPublicProxy.setTest(Activity activity, boolean isTest); |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
当前Activity |
|
isTest |
boolean |
Y |
true,表示强制开启使用测试广告;false,表示否 |
|
示例代码:
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
|
boolean isTest = true; // 非线上包默认true,强制使用测试广告,防止被Google检测封号 if (isPublish){ // 需要打线上包时,才设为false isTest = false; } WAAdMobPublicProxy.setTest(isTest); //要SDK初始化方法之前调用 // SDK初始化 WACoreProxy.initialize(this, new WACallback<Void>() { @Override public void onSuccess(int code, String message, Void result) { // 隐藏loading HideLoading(); // 初始化成功,可以调用SDK其他接口,以及进入游戏 doSomeThing(); } @Override public void onCancel() { // 忽略,无需处理 } @Override public void onError(int code, String message, Void result, Throwable throwable) { // 隐藏loading HideLoading(); // 初始化失败,提示退出应用重新进入,或者提供界面操作让用户重试 showTipsExitOrRetry(); } } |
3.10.3 横幅广告
横幅广告必须启用硬件加速功能,在AndroidManifest.xml的application标签中添加android:hardwareAccelerated=”true”,示例如下:
|
<application android:hardwareAccelerated="true"> <activity ... /> </application> |
在Activity页面的布局中加入的横幅广告
|
WAAdMobPublicProxy.bindBannerAd(Activity activity, ViewGroup container) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
显示广告的Activity页面 |
|
container |
ViewGroup |
Y |
放置横幅广告的容器布局对象 |
建议使用FrameLayout,宽属性为match_parent,高属性为wrap_content,并且容器内无其他内容 |
失败处理建议:尽可能确保广告加载失败时,不影响用户后续体验。建议不要
给容器强制保留固定的宽高并设置游戏不一样的特殊背景如纯白背景进行展示。
Google官方使用建议:
植入横幅广告的最佳做法:https://admob.google.com/intl/zh-CN_cn/home/resources/monetize-mobile-game-with-ads
3.10.4 插页广告
3.10.4.1 检查和预加载插页广告
检查插页广告是否已准备好,若未准备好,则内部会立即开始缓存广告。
|
WAAdMobPublicProxy.checkInterstitialAdReady() |
返回值说明:
类型 |
必填 |
说明 |
备注 |
boolean |
Y |
true为广告已经准备好,调用showInterstitialAd可以展示广告;false为未准备好,此时内部会立即开始缓存广告。 |
|
备注:SDK初始化后会立即开始缓存广告,无需在此时调用该接口。为了避免调用展示的时候因缓存失败而无法显示,建议在展示前适当的时机调用该接口确保广告预加载成功(该接口判断如果接口未准备好会立即开始缓存)。比如:可以在进入关卡时调用一次该接口,确保关卡完成后调用showInterstitialAd可以正常展示广告。
3.10.4.2 展示插页广告
在Activity页面中展示插页广告
|
WAAdMobPublicProxy.showInterstitialAd(Activity activity, WAAdMobAdsCallback callback) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
显示广告的Activity页面 |
|
callback |
WAAdMobAdsCallback |
N |
广告结果回调 1.显示广告失败:onAdFailedToShow(String error_message) 2.显示广告成功:onAdShowed() 3.广告关闭:onAdDismissed() 4.广告点击:onAdClicked() |
|
示例代码:
|
if (WAAdMobPublicProxy.checkInterstitialAdReady()){ WAAdMobPublicProxy.showInterstitialAd(this, new WAAdMobAdsCallback() { // 此处忽略具体回调 }); }else{ // 继续游戏 } |
失败处理建议:尽可能确保广告加载失败时,不影响用户后续体验。建议在
WAAdMobPublicProxy.checkinterstitialAdReady()为 false 时,直接忽略显示广告继续游戏。
Google官方使用建议:
最佳实践指南:https://developers.google.com/admob/android/interstitial?hl=en#some_best_practices
植入插页式广告的最佳做法:https://admob.google.com/intl/zh-CN_cn/home/resources/monetize-mobile-game-with-ads
3.10.5.开屏广告
3.10.5.1 检查和预加载开屏广告
检查开屏广告是否已准备好,若未准备好,则内部会立即开始缓存广告。
|
WAAdMobPublicProxy.checkAppOpenAdReady() |
返回值说明:
类型 |
必填 |
说明 |
备注 |
boolean |
Y |
true为广告已经准备好,调用showAppOpenAd可以展示广告;false为未准备好,此时内部会立即开始缓存广告。 |
|
3.10.5.2 展示开屏广告
在Activity页面中展示开屏广告
|
WAAdMobPublicProxy.showAppOpenAd(Activity activity, WAAdMobAdsCallback callback) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
显示广告的Activity页面 |
|
callback |
WAAdMobAdsCallback |
N |
广告结果回调 1.显示广告失败:onAdFailedToShow(String error_message) 2.显示广告成功:onAdShowed() 3.广告关闭:onAdDismissed() 4.广告点击:onAdClicked() |
|
示例代码:
|
if (WAAdMobPublicProxy.checkAppOpenAdReady()){ WAAdMobPublicProxy.showAppOpenAd(this, new WAAdMobAdsCallback() { // 此处忽略具体回调 }); }else{ // 继续游戏 } |
失败处理建议:尽可能确保广告加载失败时,不影响用户后续体验。建议在
WAAdMobPublicProxy.checkAppOpenAdReady()为 false 时,直接忽略显示广告继续游戏。
Google官方使用建议:
最佳实践指南:https://developers.google.com/admob/android/app-open?hl=en#best_practices
场景使用建议:
1.在启动程序的时候展示;考虑到冷启动时要等广告缓存完成才会显示,所以建议创建一个启动页,在启动页中加载游戏资源及显示开屏广告,再进入主游戏页。具体实现,可以参考Demo。
2.从其他应用切回程序的时候展示;为了避免的频繁切换应用展示过多广告,建议进行展示间隔限制,比如30分钟内切回程序只展示一次开屏广告。另外要考虑不要遮挡到可能正在展示的其他广告,比如插页,激励广告。具体实现,可以参考Demo。
Demo代码下载地址:https://github.com/ghw-wingsdk/demo-android/archive/refs/heads/master.zip
3.10.6.激励广告
在Activity页面中展示激励广告,用户看完广告后会通过后台进行奖励发放。
如果广告还未准备好,会立即开始请求广告并显示loading转圈,等广告加载完成后会立即展示,或者加载失败直接返回回调。
|
WAAdMobPublicProxy.showRewardedAd(Activity activity, String adName, String extInfo, WAAdMobAdsCallback callback) |
参数说明:
参数名 |
类型 |
必填 |
说明 |
备注 |
activity |
Activity |
Y |
显示广告的Activity页面 |
|
adName |
String |
N |
广告名称,从运营处获取,SDK会根据ad名称展示对应的广告。 |
传入null或空则默认使用配置的第一个激励广告。 |
extInfo |
String |
N |
透传参数,该参数内容会在通知游戏发货时一起给到游戏服务器,长度限制为100个字符。 |
|
callback |
WAAdMobAdsCallback |
N |
广告结果回调 1.显示广告失败:onAdFailedToShow(String error_message) 2.显示广告成功:onAdShowed() 3.广告关闭:onAdDismissed() 4.广告点击:onAdClicked() |
|
示例代码:
|
WAAdMobPublicProxy.showRewardedAd(MainActivity.this, "Item_1", "{info:\"123\"}", new WAAdMobAdsCallback() { @Override public void onAdFailedToShow(@NonNull String error_message) { // 广告加载失败,可以提示用户广告暂不可用,稍后再试 } // 此处忽略其他具体回调 }); |
失败处理建议:可以在广告显示的 onAdFailedToShow回
调失败中提示用户,广告暂不可用,稍后再试。
Google官方使用建议:
植入激励广告的最佳做法:https://admob.google.com/intl/zh-CN_cn/home/resources/monetize-mobile-game-with-ads
3.11 官网包配置
注意:Google包无需配置。
如果是官网包,在AndroidManifest.xml中加入下面配置:
1.官网包标志
|
<meta-data android:name="com.wa.sdk.OFFICIAL_PACKAGE" android:value="true"/> |
2.权限声明
|
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> |
3.Provider声明
|
<provider android:name="com.wa.sdk.wa.core.sdkadid.WASdkAdIdProvider" android:authorities="com.wa.provider.ad.{自行定义,建议使用游戏简称}" android:exported="true" /> |
注意:
authorities必须以 ”com.wa.provider.ad” 为前缀,后缀建议使用游戏简称。比如游戏简称为 loap,则authorities可以设置为 com.wa.provider.ad.loap
4.COM_TYPE声明
其中xx值从运营处获取
|
<meta-data android:name="com.wa.sdk.COM_TYPE" android:value="xx" /> |
5.CHANNEL 声明
其中xx值从运营处获取
|
<meta-data android:name="CHANNEL" android:value="xx" /> |
3.12 leidian雷电模块配置
1.在项目目录下的build.gradle文件添加以下配置,否则无法正常拉取雷电依赖库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
apply plugin: 'maven' allprojects { repositories { jcenter() maven { allowInsecureProtocol= true url "http://repo.wingsdk.cn:8081/repository/winga-group/" } //以下是雷电联运包的maven仓库地址+访问凭证 maven { url 'https://maven.aliyun.com/repository/public' } maven { credentials { username '6445f183daafbed659eb2c18' password 'oWuvewt2tR1A' } url 'https://packages.aliyun.com/5f05a0346207a1a8b17f4aaf/maven/cz-public-repo' } } } |
2.AndroidManifest.xml.xml中application标签下添加以下配置:
|
<meta-data android:name="com.ld.APP_ID" android:value="@string/ld_app_id" /> <meta-data android:name="com.ld.APP_KEY" android:value="@string/ld_app_key" /> <meta-data android:name="com.ld.CHANNEL_ID" android:value="@string/ld_channel_id" /> <meta-data android:name="com.ld.SUN_CHANNEL_ID" android:value="@string/ld_sub_channel_id" /> |
ld_app_id、ld_app_key、ld_channel_id、ld_sub_channel_id的具体值从运营处获取。
3.在游戏页中添加生命周期处理方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
<br />@Override protected void onResume() { super.onResume(); WACommonProxy.onResume(this); // 接入雷电渠道才需要 } @Override protected void onPause() { super.onPause(); WACommonProxy.onPause(this); // 接入雷电渠道才需要 } @Override protected void onDestroy() { super.onDestroy(); WACommonProxy.onDestroy(this); // 接入雷电渠道才需要 } |
4 、第三方配置
4.1 Google相关配置
游戏如需使用Google账号进行登录、Google商店进行支付,需要进行以下配置。 如果不需要使用Google相关功能,请忽略此章节
后台配置请参考第三方后台配置—Android版公共配置流程。
4.1.1 Google基本配置
在values/strings.xml中添加公钥字符串资源:
在values/strings.xml中添加服务器OAuth client ID(即Google后台Web application 类型的OAuth client ID):
|
<!-- Google Web application type OAuth 2.0 client ID --> <string name="google_server_client_id">YOUR_SERVER_OAUTH_CLIENT_ID</string> |
4.1.2 Google Game Service配置
游戏如需使用Google game service相关功能,需要进行以下配置。 如果不需要相关功能,请忽略此章节
使用Google Game Service服务,还需要在AndroidManifest.xml.xml中application标签下添加以下配置:
|
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/google_game_app_id" /> |
说明:字符资源的值是Google Game Service的APP ID,需要Google开发者控制台创建游戏服务获得。请参考第三方后台配置—Android版添加Google Game Service支持。
注意:因为值的内容是数字,要求必须在资源清单文件(如:strings.xml)中使用string类型声明之后引用,否则Game Service SDK无法识别。
4.1.3 Google代码混淆配置
|
-dontwarn com.google.** -keep class com.google.android.gms.** { *; } -keep class com.google.firebase.** { *; } -keep class com.android.vending.billing.** { *; } |
4.1.4 Google获取SHA-1指纹
获取程序签名文件SHA-1命令如下:
|
keytool -exportcert -alias <release_key_alias> -keystore <path-to-production-keystore> -list -v |
其中<release_key_alias>是证书别名,<path-to-production-keystore>是证书的地址。
4.2 Facebook相关配置
游戏如需使用Facebook相关登录、社交、数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
4.2.1 Facebook基本配置
在strings.xml中添加Facebook APP ID、Client Token、login protocol scheme声明::
|
<string name="facebook_app_id">YOUR_FACEBOOK_APP_ID</string> <string ame="fb_login_protocol_scheme">fb+YOUR_FACEBOOK_APP_ID</string> <string ame="facebook_client_token">YOUR_FACEBOOK_CLIENT_TOKEN</string> |
在AndroidManifest.xml中添加配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
<!-- Facebook Start --> <provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider${YOUR_FACEBOOK_APP_ID}" android:exported="true" /> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token" /> <activity android:name="com.facebook.CustomTabActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="@string/fb_login_protocol_scheme" /> </intent-filter> </activity> <!-- Facebook End --> |
注意:
1、string的name必须为facebook_app_id,不可更改,值为Facebook app id
2、fb_login_protocol_scheme格式为fb+ YOUR_FACEBOOK_APP_ID,如facebookkid为2929419560408279,则fb_login_protocol_scheme为 fb2929419560408279
3、将FacebookContentProvider后面的${YOUR_FACEBOOK_APP_ID}替换成你的Facebook app id。获取方式请参考第三方后台配置—Android版2.1 Facebook基础配置。
4、client token 获取方式: 获取方式参考
4.2.2 Facebook代码混淆配置
|
-keep class com.facebook.** { *; } -keep class bolts.** { *; } |
4.3 AppsFlyer相关配置
游戏如需使用Appsflyer相关数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
4.3.1 AppsFlyer代码混淆配置
|
-dontwarn com.google.android.gms.** -dontwarn com.appsflyer.** -keep class com.appsflyer.** { *; } -keep class android.support.** { *; } |
4.4.AiHelp智能客服
4.4.1 AIHelp相关配置
游戏如需使用智能客服 AIHelp客服系统,需要进行以下配置。如果不需要相关功能,请忽略此章节
在AndroidManifest.xml文件的application标签下中添加以下配置
|
<meta-data android:name="com.wa.sdk.AIHelp_appKey" android:value="YOUR_AIHelp_appKey" /> <meta-data android:name="com.wa.sdk.AIHelp_domain" android:value="YOUR_AIHelp_domain" /> <meta-data android:name="com.wa.sdk.AIHelp_appId" android:value="YOUR_AIHelp_appId" /> |
注意事项:AIHelp_domain配置必须使用三级域名的形式。例如原gamehollywoodhk@aihelp.net需要改为 gamehollywoodhk.aihelp.net。
4.4.2 AiHelp混淆配置
打包apk混淆代码配置中增加以下配置
|
-keep class net.aihelp.** {*;} |
4.5 GHGL模块相关配置
4.5.1 基础配置
在项目app目录层级下的res/values/strings.xml中添加wa_custom_tab_scheme声明
|
<string name="wa_custom_tab_scheme">wa+YOUR_SDK_APPID</string> |
注意:
1.string的name必须为wa_custom_tab_scheme,不可更改
2.格式为wa+YOUR_SDK_APPID。比如SDK的appid为f7f9a9d18da611e5a0be000d3a906774,则wa_custom_tab_scheme的对应内容为waf7f9a9d18da611e5a0be000d3a906774
3.这里SDK的appid为wingsdk的appid
4.6 nowgg相关配置
4.6.1 nowgg基本配置
AndroidManifest.xml.xml中application标签下添加以下配置:
|
<meta-data android:name="com.wa.sdk.nowgg.CLIENT_ID" android:value="{nowgg应用的客户端ID" /> <meta-data android:name="com.wa.sdk.nowgg.PAYMENT_ID" android:value="{nowgg应用的支付ID,例如:1234}" /> |
CLIENT_ID 和 PAYMENT_ID 的具体值从运营处获取。
PaymentId 付款编号 获取参考:付款编号获取
ClientId 登录凭证 获取参考:登录凭证获取
4.6.2 最低API版本调整到24
minSdkVersion 24
5 、不常用功能
不常用功能
6 、附录
6.1 代码说明
6.1.1 状态码说明
SDK中的状态码统一以静态变量方式封装在WACallback接口里面,如果使用到状态码,强烈建议采用静态变量的方式调用,不要直接使用数值。
名称 |
取值 |
说明 |
CODE_SUCCESS |
200 |
成功 |
CODE_ERROR |
400 |
错误 |
CODE_UNAUTHERIZED |
401 |
请求未认证:访问受限资源是缺少认证信息,或者认证未通过 |
CODE_FORBIDEN |
403 |
禁止访问:由于应用上下文原因或请求端上下文的原因被禁止访问资源,例如IP限制等 |
CODE_NOT_FOUND |
404 |
找不到被访问资源:接口不存在、页面不存在或对应的业务实体找不到 |
CODE_SERVER_ERROR |
500 |
服务器内部故障 |
CODE_API_INVALID |
501 |
所请求接口或页面未实现 |
CODE_SDK_APPID_INVALID |
4010 |
无效appId: appId不存在或未开启 |
CODE_SIGN_ERROR |
4011 |
无效osign:osign校验失败 |
CODE_REQUEST_TIME_OUT |
4012 |
请求已过期:ots校验失败 |
CODE_PLATFORM_VERIFY_ERROR |
4013 |
第三方平台验证失败 |
CODE_ACCOUNT_VERIFY_ERROR |
4014 |
访客登录验证失败,登录验证失败 |
CODE_PLATFORM_BOUND_ALREADY |
4015 |
用户已经绑定了这个平台的其他账户 |
CODE_PRE_PLATFORM_VERIFY_ERROR |
4016 |
prePlatform验证失败 |
CODE_USER_NOT_FOUND |
4017 |
用户不存在(没有找到) |
CODE_ACCOUNT_BOUND_BY_OTHERS |
4018 |
账户已经被其他用户绑定 |
CODE_ORDER_ID_INVALID |
4019 |
无效orderId |
CODE_ORDER_VERIFY_ERROR |
4020 |
订单验证失败 |
CODE_REWARD_NOT_FOUND |
4021 |
FB邀请奖励事件未找到奖励政策 |
CODE_REPEAT_CRASH_REPORT |
4022 |
闪退发送报告重复 |
CODE_CHENNEL_NOT_FOUND |
4023 |
未找到渠道信息 |
CODE_UNABLE_DISBAND |
4024 |
不可以执行解绑操作 |
CODE_PAY_PLATFORM_CLOSED |
4026 |
支付渠道已关闭 |
CODE_LOGIN_PLATFORM_CLOSED |
4029 |
登录渠道已关闭 |
CODE_AD_NOT_CONFIG |
4044 |
CP关闭广告开关或未配置广告奖励信息 |
CODE_AD_NOT_FOUND |
4045 |
查找不到广告展示信息 |
CODE_CHANNEL_BALANCE_INSUFFICIENT |
4046 |
第三方平台余额不足 |
CODE_CHANNEL_LOGIN_INVALID |
4047 |
第三方平台登录过期 |
CODE_ACCOUNT_BIND_DISABLED |
4048 |
账号绑定关闭(不允许绑定账号) |
CODE_ACCOUNT_UNBIND_DISABLED |
4049 |
账号解绑关闭(不允许解绑账号) |
CODE_USER_CENTER_CLOSED |
4059 |
用户中心未开启 |
CODE_CANCELED |
-100 |
取消操作 |
CODE_FILE_NOT_FOUND |
-101 |
文件找不到 |
CODE_API_NOT_SUPPORTED |
-102 |
API不支持 |
CODE_SDK_UNINITIALIZED |
-200 |
SDK没有初始化 |
CODE_CONTENT_CAN_NOT_BE_SHARED |
-201 |
内容不可分享,一般是传入的内容为空,或者其他 |
CODE_NOT_LOGIN |
-202 |
没有登录 |
CODE_LOGIN_FAILURE |
-203 |
登录失败 |
CODE_NO_PERMISSION |
-204 |
登录没有获取到相应的权限 |
CODE_EXCEPTION |
-205 |
Facebook内部定义的错误,异常信息 |
CODE_FILE_SIZE_LIMIT |
-206 |
文件大小超出限制 |
CODE_NOT_LOGIN_WITH_PLATFORM |
-207 |
没有以平台登录 |
CODE_SERVER_ID_NOT_FOUND |
-208 |
ServerId没有设置 |
CODE_ACCOUNT_NOT_FOUND |
-209 |
账户不存在 |
CODE_ACCOUNT_NOT_ALLOW_UNBIND |
-210 |
账户不允许解绑 |
CODE_PLATFORM_ACCOUNT_NOT_MATCH |
-211 |
登录的平台账户和当前用户不匹配 |
CODE_GAME_USER_ID_NOT_FOUND |
-212 |
Game user id没有设置 |
CODE_GOOGLE_SERVICE_MISSING |
-301 |
没有安装Google服务 |
CODE_GOOGLE_SERVICE_UPDATING |
-302 |
Google服务正在更新中 |
CODE_GOOGLE_SERVICE_VERSION_UPDATE_REQUIRED |
-303 |
Google服务版本过低,需要更新 |
CODE_GOOGLE_SERVICE_DISABLED |
-304 |
Google服务被禁用 |
CODE_GOOGLE_SERVICE_INVALID |
-305 |
Google服务不可用 |
CODE_DEVICE_NO_SUPPORTED |
-401 |
设备不支持 |
CODE_NETWORK_UNAVAILABLE |
-402 |
网络不可用 |
CODE_PAY_SERVICE_DISCONNECTED |
-501 |
支付:服务连接中断 |
CODE_PAY_SERVICE_UNUSABLE |
-502 |
支付:服务不可用 |
CODE_PAY_ITEM_UNAVAILABLE |
-503 |
支付: 商品不可用 |
CODE_PAY_DEVELOPER_ERROR |
-504 |
支付:开发者错误 |
CODE_PAY_ITEM_ALREADY_OWNED |
-505 |
支付:已经拥有该商品(没有消耗) |
CODE_PAY_ITEM_NOT_OWNED |
-506 |
支付:没有拥有该商品 |
CODE_PAY_WITHOUT_REPORT |
-507 |
支付:支付成功但是没有上报或者上报失败了 |
CODE_PAY_CHECKING_FAILED |
-508 |
支付:支付成功,但是通知后台的时候校验失败了 |
CODE_PAY_REORDER_TIME_LIMIT |
-509 |
支付:订单时间间隔限制(在特定的时间内重复下订单) |
CODE_ACHIEVEMENT_NOT_INCREMENTAL |
-601 |
成就不是分步成就(非分不成就进行递增或设置步数时) |
CODE_ACHIEVEMENT_UNKNOWN |
-602 |
成就id不存在,找不到指定成就 |
CODE_ACHIEVEMENT_UNLOCKED |
-603 |
成就已经解锁(尝试解锁已经被解锁的成就时) |
CODE_ACHIEVEMENT_UNLOCK_FAILURE |
-604 |
成就解锁失败(解锁隐藏成就时) |
CODE_GAME_NEED_SIGN |
-605 |
游戏服务已登出,需要重新登录 |
6.1.2 平台取值
平台取值统一在 WAConstants 类中,建议使用静态常量,不要直接使用对应值。比如Google平台可以使用 WAConstants.CHANNEL_GOOGLE 进行取值。
名称 |
取值 |
备注 |
CHANNEL_WA |
WINGA |
WA平台,手机号邮箱登录 |
CHANNEL_GUEST |
GUEST |
游客登录 |
CHANNEL_GOOGLE |
GOOGLE |
Google平台 |
CHANNEL_FACEBOOK |
FACEBOOK |
Facebook平台 |
CHANNEL_VK |
VK |
VK平台 |
CHANNEL_TWITTER |
TWITTER |
Twitter平台 |
CHANNEL_INSTAGRAM |
INSTAGRAM |
Instagram平台 |
CHANNEL_HUAWEI_HMS |
华为海外 |
华为平台 |
CHANNEL_GHG |
GHG_INTEGRATION |
Game Hollywood Games平台 |
CHANNEL_R2 |
R2_INTEGRATION |
R2Games平台 |
CHANNEL_APPSELF |
APPSELF |
应用内登录 |
CHANNEL_NOWGG |
NOWGG |
Nowgg平台 |
6.2 事件说明
6.2.1 SDK预定义事件名
在WAEventType接口中定义
静态变量名称 |
事件名称 |
说明 |
INITIATED_PURCHASE |
ghw_initiated_purchase |
点击购买 |
COMPLETE_PURCHASE |
ghw_purchase |
购买完成 |
WAEventUserInfoUpdate |
ghw_user_info_update |
更新用户信息 |
USER_CREATED |
ghw_user_create |
创建角色 |
IMPORT_USER |
ghw_user_import |
导入用户 |
LEVEL_ACHIEVED |
ghw_level_achieved |
等级或分数 |
6.2.2 SDK预定义参数名
在WAEventParameterName接口中定义
静态变量名称 |
参数名称 |
数据类型 |
说明 |
ACCOUNT_TYPE |
accountType |
String |
账户类型 |
GENDER |
gender |
int |
性别 |
AGE |
age |
int |
年龄 |
SUCCESS |
success |
boolean |
是否成功 |
TRANSACTION_ID |
transactionId |
String |
交易的流水号 |
PAYMENT_TYPE |
paymentType |
String |
支付类型 |
CURRENCY_TYPE |
currencyType |
String |
货币类型 |
CURRENCY_AMOUNT |
currencyAmount |
float |
现金额 |
VERTUAL_COIN_AMOUNT |
virtualCoinAmount |
int |
虚拟货币数量 |
VERTUAL_COIN_CURRENCY |
virtualCurrency |
String |
虚拟货币类型 |
IAP_ID |
iapId |
String |
道具ID |
IAP_NAME |
iapName |
String |
道具名称 |
IAP_AMOUNT |
iapAmount |
int |
道具数量 |
ITEM_NAME |
itemName |
String |
游戏内虚拟物品的名称/ID |
ITEM_AMOUNT |
itemAmount |
int |
交易的数量 |
SCORE |
score |
int |
得分数 |
PRICE |
price |
float |
价格 |
CONTENT_TYPE |
contentType |
String |
内容类型 |
CONTENT_ID |
contentId |
String |
内容ID |
QUANTITY |
quantity |
int |
数量 |
SEARCH_STRING |
searchString |
String |
搜索关键字 |
DESCRIPTION |
description |
String |
描述 |
NICKNAME |
nickname |
String |
昵称 |
VIP |
vip |
int |
等级 |
ROLE_TYPE |
roleType |
String |
角色类型 |
BINDED_GAME_GOLD |
bindGameGold |
int |
绑定钻石 |
GAME_GOLD |
gameGold |
int |
用户钻石数 |
FIGHTING |
fighting |
int |
战斗力 |
REGISTER_TIME |
registerTime |
long |
注册时间 |
TASK_ID |
taskId |
String |
任务Id |
TASK_NAME |
taskName |
String |
任务名称 |
TASK_TYPE |
taskType |
String |
任务类型 |
TASK_STATUS |
taskStatus |
int |
任务状态:状态标识:1→领取任务, 2→开始任务, 3→待领奖(任务完成), 4→已领奖 |
GOLD_TYPE |
goldType |
int |
货币类型 |
AMOUNT |
amount |
int |
变更货币数 |
APPROACH |
approach |
String |
变更途径 |
IS_FIRST_ENTER |
isFirstEnter |
int |
是否第一次导入用户, 默认为0, 是为1 |
STATUS |
status |
int |
状态 |