lizhihui

重新整理区分海内外文档

Showing 57 changed files with 777 additions and 188 deletions
......@@ -57,3 +57,6 @@
- 修复防沉迷计时可能不准的问题, 增加了埋点的类型和参数,直接替换PoolSdk_V2_xxxx.jar
- 2021-01-20
- 去掉sentry上报,增加留存事件埋点类型,直接替换PoolSdk_V2_xxxx.jar
- 2021-11-16
- 重新整理国内与海外文档
\ No newline at end of file
......
<?xml version="1.0" ?>
<config>
<sdkconfig channelparameter1="" channelparameter2="" custom="{}" gamechannelid="" gamesimplename="ces" logceportcrl="https://public.sdk.guangkatf.com/sdk/statistic" logincheckurl="https://public.sdk.guangkatf.com/logincheck/check" paycheckurl="https://public.sdk.guangkatf.com/paycheck/confirm" payorderurl="https://public.sdk.guangkatf.com/paycheck/create" sdksimplename="poolsdk" sdkversioncode="V1_0" usertype="597"/>
<sdkconfig channelparameter1="" channelparameter2="" custom="{}" gamechannelid="" gamesimplename="fytx_test" logincheckurl="http://183.136.223.85:9010/logincheck/check" logreporturl="http://183.136.223.85:9030/sdk/statistic" paycheckurl="http://183.136.223.85:9020/paycheck/confirm" payorderurl="http://183.136.223.85:9020/paycheck/create" sdksimplename="poolsdk" sdkversioncode="V1_0" usertype="739"/>
</config>
......
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
<bytecodeTargetLevel target="11" />
</component>
</project>
\ No newline at end of file
......
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
......
......@@ -3,6 +3,7 @@
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
......
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion '29.0.2'
compileSdkVersion 30
buildToolsVersion '30.0.2'
defaultConfig {
applicationId "com.poolsdk.demo"
minSdkVersion 21
targetSdkVersion 29
minSdkVersion 19
targetSdkVersion 30
versionCode 2
versionName "1.0"
}
......@@ -20,18 +20,4 @@ android {
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
// implementation 'com.android.support.constraint:constraint-layout:1.0.2'
//implementation files('libs/PoolSdk_V2_20200313.jar')
// implementation 'com.android.support:appcompat-v7:28.+'
// implementation 'com.android.support:support-v4:28.+'
//
// implementation 'com.android.support.constraint:constraint-layout:1.1.3'
// implementation 'com.android.support:design:28.+'
// implementation 'com.appsflyer:af-android-sdk:5.4.1'
// implementation 'com.android.installreferrer:installreferrer:1.0'
// implementation 'com.google.android.gms:play-services-ads-identifier:16.0.0'
// compile 'com.google.firebase:firebase-core:16.0.6'
// compile 'com.google.firebase:firebase-messaging:17.3.4'
}
......
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
......@@ -4,7 +4,7 @@
<!-- SDK start -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 国内需要用公共SDK的后台数据功能需要以下权限 -->
<!-- 国内需要用公共SDK的后台数据功能需要以下权限(非必要) -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
......@@ -23,7 +23,6 @@
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
......
<?xml version="1.0" ?>
<config>
<sdkconfig channelparameter1="" channelparameter2="" custom="{}" gamechannelid="" gamesimplename="ces" logreporturl="https://public.sdk.guangkatf.com/sdk/statistic" logincheckurl="https://public.sdk.guangkatf.com/logincheck/check" paycheckurl="https://public.sdk.guangkatf.com/paycheck/confirm" payorderurl="https://public.sdk.guangkatf.com/paycheck/create" sdksimplename="poolsdk" sdkversioncode="V1_0" usertype="597"/>
<sdkconfig channelparameter1="" channelparameter2="" custom="{}" gamechannelid="" gamesimplename="fytx_test" logincheckurl="http://183.136.223.85:9010/logincheck/check" logreporturl="http://183.136.223.85:9030/sdk/statistic" paycheckurl="http://183.136.223.85:9020/paycheck/confirm" payorderurl="http://183.136.223.85:9020/paycheck/create" sdksimplename="poolsdk" sdkversioncode="V1_0" usertype="739"/>
</config>
......
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.youai.poolsdk.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<!-- SDK start -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="org.simalliance.openmobileapi.SMARTCARD" />
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc.hce" />
<!-- SDK end -->
<application
android:name="com.gzyouai.publicsdk.application.PoolSDKApplication"
android:allowBackup="true"
android:icon="@drawable/public_sdk_self_ic_launcher"
android:label="@string/app_name" >
<activity
android:name="com.youai.foolsdk.demo.AppActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- SDK start -->
<receiver
android:name="com.gzyouai.fengniao.sdk.framework.AppInstallReceiver"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<activity
android:name="com.youai.sdk.YouaiSDK"
android:label="youai_sdk"
android:launchMode="singleTask"
android:theme="@android:style/Theme.Dialog" />
<service
android:name="com.youai.sdk.YouaiService"
android:enabled="true" >
<intent-filter>
<action android:name="com.youai.sdk.YouaiService" />
</intent-filter>
</service>
<service
android:name="com.youai.sdk.FloatViewService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="com.youai.sdk.FloatViewService" />
</intent-filter>
</service>
<receiver android:name="com.youai.sdk.Receiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="keyboardHidden|navigation|orientation"
android:exported="false"
android:screenOrientation="behind" />
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="keyboardHidden|navigation|orientation"
android:exported="false"
android:screenOrientation="behind" />
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop" />
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop" />
<!-- SDK end -->
</application>
</manifest>
\ No newline at end of file
No preview for this file type
No preview for this file type
# cache for current jar dependency. DO NOT EDIT.
# format is <lastModified> <length> <SHA-1> <path>
# Encoding is UTF-8
No preview for this file type
......@@ -91,6 +91,8 @@ public class AppActivity extends Activity implements OnClickListener {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PoolSdkHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
//如果游戏有权限申请,进入游戏时申请权限完毕再调用公共SDK初始化接口
init(saveBundle);
}
......@@ -100,11 +102,12 @@ public class AppActivity extends Activity implements OnClickListener {
saveBundle = savedInstanceState;
initView();
PoolSdkLog.setIsShowLog(true);
PoolSdkLog.setIsShowLog(true);//游戏无需设置该接口
PoolSdkConfig.readPoolSdkConfigData(this);
//国内游戏接入如果需要使用平台统计等功能,需要获取手机识别号和读写SD卡权限再调用初始化接口
//海外接入直接调用SDK初始化接口即可
if(getApplicationInfo().targetSdkVersion >= 23 && Build.VERSION.SDK_INT >= 23){
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {
......@@ -157,24 +160,6 @@ public class AppActivity extends Activity implements OnClickListener {
* }
*/
break;
case PoolSDKCode.POOLSDK_EXTENDS_CODE1:
//实名认证成功才有回调
//msg为生日
break;
case PoolSDKCode.POOLSDK_ANTIADDICTION_EXIT://防沉迷满登录时间或者不在可登录时间回调
PoolSdkLog.logError("游戏收到回调 POOLSDK_ANTIADDICTION_EXIT:"+msg);
break;
case PoolSDKCode.POOLSDK_ANTIADDICTION_CHANNEL_NOTEXIST://渠道SDK没有实名认证功能
PoolSdkLog.logError("游戏收到回调 POOLSDK_ANTIADDICTION_CHANNEL_NOTEXIST:"+msg);
break;
case PoolSDKCode.POOLSDK_ANTIADDICTION_PAY://防沉迷无法充值回调
PoolSdkLog.logError("游戏收到回调 POOLSDK_ANTIADDICTION_PAY:"+msg);
break;
case PoolSDKCode.POOLSDK_ANTIADDICTION_CODE://渠道返回玩家实名认证信息
PoolSdkLog.logError("游戏收到回调 POOLSDK_ANTIADDICTION_CODE:"+msg);
break;
default:
break;
}
......@@ -188,18 +173,14 @@ public class AppActivity extends Activity implements OnClickListener {
PoolSdkHelper.setLogoutCallback(new PoolLogoutListener() {
@Override
public void onLogoutSuccess() {
// TODO: 此处处理SDK登出的逻辑
PoolSdkLog.logInfo("游戏中收到SDK logoutSuccess回调");
//游戏退出当前账号 回到初始界面 重新调起登录操作
//游戏退出当前账号 回到初始界面 重新调起登录操作
login();
}
});
//开启公共SDK的防沉迷功能,国内游戏按需使用,海外游戏无需接入
PoolSdkAntiAddiction.isUseAntiAddiction = true;
//PoolSdkAntiAddiction.isUseAntiAddictionToast = true;//防沉迷相关toast提示(默认关闭)
}
// 生命周期相关
@Override
public void onStart() {
super.onStart();
......@@ -339,30 +320,7 @@ public class AppActivity extends Activity implements OnClickListener {
}else if(view == btQueryProducts){
queryProducts();
}else if (view == pb_bt_verifyname){
//Toast.makeText(this,PoolSdkHelper.verifyRealName(this),Toast.LENGTH_SHORT).show();
//渠道无实名认证功能时,可以调用公共SDK的实名认证接口,在登录成功后才可以调用,海外游戏无需接入,国内游戏按需使用
PoolSdkHelper.setUserIDInfo("尚福乐", "211322198509260317", new PoolSdkAntiAddictionUserInfoListener() {
@Override
public void onSuccess(int totalGameTime, int totalPayMoney, String ymd) {
}
@Override
public void onFail(String paramCustom) {
}
@Override
public void onResult(String s) {
}
public void onResutl(String result) {
PoolSdkLog.logError("游戏获取实名结果:"+result);
}
});
}
}
......@@ -476,6 +434,8 @@ public class AppActivity extends Activity implements OnClickListener {
poolRoleInfo.setCallType(PoolRoleInfo.Type_EnterGame);//进入游戏(第一次创建角色后需再调用一次进入游戏)
// poolRoleInfo.setCallType(PoolRoleInfo.Type_CreateRole);//创建角色
// poolRoleInfo.setCallType(PoolRoleInfo.Type_RoleUpgrade);//角色升级
//以下可选
// poolRoleInfo.setCallType(PoolRoleInfo.Type_SelectServer);//选择服务器
// poolRoleInfo.setCallType(PoolRoleInfo.Type_ExitServer);//退出服务器
// poolRoleInfo.setCallType(PoolRoleInfo.Type_Change_RoleName);//改名
......
# 公共SDK接入文档 #
## 接入必读
`
接入公共SDK测试没问题后游戏打出为 母包 ,后续使用打包工具打对应 渠道包
`
## 海外渠道SDK基本都有Facebook登录,谷歌登录,谷歌支付,firebase,appsflyer统计,游戏母包最好移除非必要的第三方库,以减少合并打包冲突
## 1、开发环境搭建 ##
以下是以 Eclipse 为例,在 Eclipse 环境下开发的 SDK 配置(AS接入方式一样)
#### 1.1、将 SDK 压缩包中 libs 目录下的所有 资源 包复制到游戏工程的libs 目录下 ####
#### 1.2、复制SDK压缩包中assets目录下的所有内容到游戏工程的assets目录 ####
- 将游戏中的闪屏图片放到assets中poolsdk_splash目录下(选用,图片文件名任意,最多支持2张闪屏)
- 将assets中的poolsdk.xml配置文件替换(具体文件请与运营人员申请)
#### 1.3、修改游戏工程的AndroidManifest.xml ####
- 添加声明权限:(游戏自行处理自己必要的权限申请,渠道SDK自身需要的权限由渠道自行处理)
```
<uses-permission android:name="android.permission.INTERNET" /> <!-- 必要 -->
```
### 2、功能接口 (注意:以下所有接口都必须在游戏收到 SDK 初始化完成之后才能调用) ###
#### 2.1、继承 PoolSDKApplication(必接)
游戏工程如果没有Application,请在 AndroidManifest.xml 中添加SDK的Application,如下所示:
```xml
<application android:name="com.gzpublic.app.sdk.application.PoolSDKApplication">
```
游戏工程如果有 Application,请继承 SDK 中 PoolSDKApplication:
```java
public class XXXXApplication extends PoolSDKApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
```
#### 2.2、初始化接口(必接)
注意: 初始化接口必须在调用权限回调以后再调用
接口说明:
首先在程序开始的地方调用 SDK 的初始化 init 方法,并设 置 Activity 对像和初始化完成回调
监听(在初始化失败情况下不 再调用其它 SDK 接口方法)
注意:要确保在 SDK 初始化成功后才可调用其它接口
2.2.1、方法定义
public static void init(final Activity activity,final PoolSDKCallBackListener callBackListener)
#### 2.2.2、参数说明
| 参数 | 说明 |
| ---------------- | -------------------------------- |
| activity | Activity 对应 |
| callBackListener | 初始化完成回调通知,需实现 poolSdkCallBack 方法 |
```java
2.2.3、代码示例:
PoolSdkHelper.init(this, new PoolSDKCallBackListener() {
@Override
public void poolSdkCallBack(int code, String msg) {
PoolSdkLog.logInfo("callback: code:" + code + "msg:" + msg);
switch (code) {
case PoolSDKCode.POOLSDK_INIT_SUCCESS:// 初始化成功
PoolSdkLog.logInfo("游戏中POOLSDK_INIT_SUCCESS");
login();
break;
case PoolSDKCode.POOLSDK_INIT_FAIL:
//初始化失败
break;
case PoolSDKCode.POOLSDK_QUERY_WITH_PRODUCTS://查询商品信息返回(用于根据不同的谷歌商店地区显示当地货币价格)
//msg:为查询的结果值
/**
* {//查询商品信息返回数据
* "android.test.purchased0": {//key为商品ID
* "displayPrice": "₩1167.28",//显示价格
* "price": "₩1,167", //实际价格(去除小数点) 充值传递
* "priceAmountMicros": 1167284249, //数字价格
* "priceCurrencyCode": "KRW", //货币代码
* "sku": "android.test.purchased0",//商品ID
* "title": "名称示例"
* }
* }
*/
break;
}
}
});
```
#### 2.3、登录接口(必接)
接口说明:游戏登录时调用
#### 2.3.1、方法定义
```java
public static void login(final String paramCustom,final PoolLoginListener poolLoginListener)
```
#### 2.3.2、参数说明
| 参数 | 说明 |
| ----------------- | ---------------------------------------- |
| paramCustom | 游戏自定义参数,可通过登录成功回调方法onLoginSuccess 中的参数PoolLoginInfo 对象的 getCustom()获取 |
| poolLoginListener | 登录结果回调通知,需实现 onLoginSuccess 方法 |
```java
2.3.3、代码示例
PoolSdkHelper.login("登录自定义字段", new PoolLoginListener() {
@Override
public void onLoginSuccess(PoolLoginInfo poolLoginInfo) {
String userType = poolLoginInfo.getUserType();
String timestamp = poolLoginInfo.getTimestamp();
String serverSign = poolLoginInfo.getServerSign();
String openId = poolLoginInfo.getOpenID();
//把以上信息发送给游戏服务端做登录校验,需要其他信息请从poolLoginInfo对象中获取
System.out.println("登录成功 userType = " + userType
+ "; timestamp = " + timestamp + "; serverSign = "
+ serverSign + "; openId = " + openId);
}
@Override
public void onLoginFailed(String errorMsg) {
System.out.println("登录失败 = " + errorMsg);
}
});
```
#### 2.4、提交角色数据接口(必接)
接口说明:游戏提交角色数据接口,该接口需要在以下9中情况下调用:
进入游戏主场景、创建角色、角色更新(vip等级升级也由此类型上报)、选择服务器、退出服务器、改名、选角、关卡开始、关卡结束
**(如果游戏创建角色时没有角色名,需要在用户创建角色名时调用多一次进入游戏统计,否则用户名无法正常统计,投放测试无法通过)**
#### 2.4.1、方法定义
```java
public static void submitRoleData(final PoolRoleInfo poolRoleInfo,final PoolRoleListener poolRoleListener)
```
#### 2.4.2、参数说明
| 参数 | 说明 |
| ---------------- | ---------------- |
| poolRoleInfo | 角色数据实体类 |
| poolRoleListener | 角色数据提交结果回调通知,需实现 |
PoolRoleInfo 实体类字段说明(以下参数都为必传参数,如游戏没有的传 "无" 或者 "0")
| 字段名 | 说明 |
| -------------- | ---------------------------------------- |
| callType | 调用类型 Type_EnterGame 进入游戏(必接); Type_CreatRole 创建角色(必接); Type_RoleUpgrade 为角色更新(vip等级升级也由此类型上报)(必接); Type_SelectServer 为选择服务器(选接); Type_ExitServer 为退出服务器 (选接); Type_Change_RoleName 为改名(选接); Type_SelectRole 为选角(选接); Type_CheckPoint_Start 为关卡开始(选接); Type_CheckPoint_End 为关卡结束(选接);|
| roleId | 角色 Id(请用数字) |
| roleName | 角色名称 |
| roleLevel | 角色等级 (请用数字) |
| roleSex | 角色性别(1 男 0 女,如果角 色不分性别请填写 0) |
| serverId | 服务器 id (请用数字) |
| serverName | 服务器名称 |
| custom | 自定义字段 |
| roleCTime | 角色创建时的时间戳(以秒为单位) (请用数字) |
| partyName | 公会名称 (没有的传 "无") |
| roleType | 角色类型 (没有的传 "无") |
| roleChangeTime | 角色等级变化时的时间戳(以秒为单位) (请用数字) |
| vipLevel | VIP等级 (请用数字,如无请传"0") |
| diamond | 余额 (请用数字,如无请传"0") |
| moneyType | 商品单位 (如 "钻石"、"金币"、"水晶"等) |
| power | 战力 (请用数字,如无请传"0") |
| partyId | 工会id (请用数字,如无请传"0") |
| professionId | 职业id (请用数字,如无请传"0") |
| professionName | 职业名称 (没有的传 "无") |
| reborn | 角色转生等级 (请用数字,如无请传"0") |
| checkPointId | 关卡id (请用数字,如无请传"0") |
| checkPointName | 关卡名 (没有的传 "无") |
```java
2.4.3、代码示例
/********************************************
* 以下所有字段都是必填项
*/
PoolRoleInfo poolRoleInfo = new PoolRoleInfo();
poolRoleInfo.setRoleID("123456");
poolRoleInfo.setRoleLevel("10");
poolRoleInfo.setRoleSex("0");
poolRoleInfo.setRoleName("我是角色名");
poolRoleInfo.setServerID("1");
poolRoleInfo.setServerName("我是服务器名");
poolRoleInfo.setCustom("角色创建时间");
poolRoleInfo.setRoleCTime(System.currentTimeMillis()/1000);//角色创建时(秒)
poolRoleInfo.setPartyName("公会名称");
poolRoleInfo.setRoleType("狂战");//角色类型
poolRoleInfo.setRoleChangeTime(System.currentTimeMillis()/1000);//角色更新时间
poolRoleInfo.setVipLevel("10");//vip等级
poolRoleInfo.setDiamond("1000");//余额
poolRoleInfo.setMoneyType("金币");//商品单位
poolRoleInfo.setPower("10");//战力
poolRoleInfo.setPartyId("10");//工会id
poolRoleInfo.setProfessionId("10");//职业id
poolRoleInfo.setProfessionName("无");//职业名称
poolRoleInfo.setReborn("0");//角色转生等级
poolRoleInfo.setCheckPointId("1");//关卡id
poolRoleInfo.setCheckPointName("关卡名");//关卡名
poolRoleInfo.setCallType(PoolRoleInfo.Type_EnterGame);//进入游戏(第一次创建角色后需再调用一次进入游戏)
// poolRoleInfo.setCallType(PoolRoleInfo.Type_CreateRole);//创建角色(如果游戏创建角色时没有角色名,需要在用户创建角色名时调用多一次进入游戏统计,否则用户名无法正常统计,投放测试无法通过)
// poolRoleInfo.setCallType(PoolRoleInfo.Type_RoleUpgrade);//角色升级(vip等级升级也由此类型上报)
// 以下类型选接
// poolRoleInfo.setCallType(PoolRoleInfo.Type_SelectServer);//选择服务器
// poolRoleInfo.setCallType(PoolRoleInfo.Type_ExitServer);//退出服务器
// poolRoleInfo.setCallType(PoolRoleInfo.Type_Change_RoleName);//改名
// poolRoleInfo.setCallType(PoolRoleInfo.Type_SelectRole);//选角
// poolRoleInfo.setCallType(PoolRoleInfo.Type_CheckPoint_Start);//关卡开始
// poolRoleInfo.setCallType(PoolRoleInfo.Type_CheckPoint_End);//关卡结束
PoolSdkHelper.submitRoleData(poolRoleInfo, new PoolRoleListener() {
@Override
public void onRoleDataSuccess(String paramCustom) {
System.out.println("提交角色数据成功 = " + paramCustom);
}
});
```
#### 2.5、支付接口(必接)
#### 2.5.1、方法定义
```java
public static void pay(final PoolPayInfo poolPayInfo,final PoolPayListener poolPayListener)
```
#### 2.5.2、参数说明
| 参数 | 说明 |
| ---------------- | ---------------- |
| poolRoleInfo | 角色数据实体类 |
| poolRoleListener | 角色数据提交结果回调通知,需实现 |
支付信息实体类(PoolPayInfo)字段说明
| 参数 | 说明 |
| ----------- | ------------------- |
| amount | 金额(单位元,必须大于 0,需传入整型数据`传小数时兑换比例和金额相乘为整数(即金额传 "0.99" 兑换比例传 "100")`) |
| productId | 商品 ID(如果没有可以传空字符串) |
| productName | 商品描述 |
| roleid | 角色 id |
| rolelevel | 角色等级 |
| roleName | 角色名称 |
| serverId | 服务器 id |
| serverName | 服务器名称 |
| exchange | 游戏币与人民币(元)的兑换比例(一般填10) `单机游戏时直接传对应购买的道具数量或游戏币数量` |
| custom | 自定义透传参数,通过回调函数原样返回 |
```java
2.5.3、代码示例
/********************************************
* 以下所有字段都是必填项
*/
// 设置充值金额,单位“元”
poolPayInfo.setAmount("1");
// 服务器id
poolPayInfo.setServerID("8");
// 服务器名
poolPayInfo.setServerName("我是服务器名");
// 角色id
poolPayInfo.setRoleID("123456");
// 角色名
poolPayInfo.setRoleName("我是角色名");
// 角色等级
poolPayInfo.setRoleLevel("10");
// 商品ID
poolPayInfo.setProductID("1");
// 商品名称
poolPayInfo.setProductName("金币");
// 商品描述
poolPayInfo.setProductDesc("购买金币");
// 兑换比例
poolPayInfo.setExchange("10");
// 自定义参数
poolPayInfo.setCustom("我是自定义参数");
// 充值回调以服务端回调为准,部分渠道客户端SDK无回调
PoolSdkHelper.pay(poolPayInfo, new PoolPayListener() {
@Override
public void onPaySuccess(String paramCustom) {
System.out.println("支付成功 = " + paramCustom);
}
@Override
public void onPayFailed(String paramCustom, String errorMsg) {
System.out.println("支付失败 = " + paramCustom + "; errorMsg = "
+ errorMsg);
}
});
```
#### 2.6、检测 SDK 是否含有用户中心接口(必接)
说明:如果接口返回为 true,表示需要游戏方在合适的界面中添加一个用户中心的按钮,点击按钮时调用文档中 2.7 的用户中心接口;
如果返回 false,则不做处理
#### 2.6.1、方法定义
```java
public static boolean hasChannelCenter()
```
```java
PoolSdkHelper.hasChannelCenter();//判断渠道SDK有无用户中心
```
#### 2.7、用户中心接口(必接)
说明:打开渠道用户中心界面
#### 2.7.1、方法定义
```java
public static void openChannelCenter()
```
```java
2.7.2、代码示例
/**
* 用户中心
*
* 游戏方先调用PoolSdkHelper.hasChannelCenter()获取是否有用户中心,
* 如果有的话,游戏中需要添加按钮,点击按钮调用PoolSdkHelper.openChannelCenter();
* 如果没有,则不需要显示按钮,也不用调用下面的接口
*/
PoolSdkHelper.openChannelCenter();
```
#### 2.8、注销登录监听接口
说明:可在游戏启动时设置注销监听事件,渠道注销成功后 SDK 会回调 onLogoutSuccess 方法通知游戏,游戏可在此处理切换账号逻辑
#### 2.8.1、方法定义
```java
public static void setLogoutCallback(final PoolLogoutListener poolLogoutListener)
```
#### 2.8.2、参数说明 ####
| 参数 | 说明 |
| ------------------ | --------------------------------- |
| poolLogoutListener | 账户注销成功回调监听,需实现 onLogoutSuccess 方法 |
```java
2.8.3、代码示例
PoolSdkHelper.setLogoutCallback(new PoolLogoutListener() {
@Override
public void onLogoutSuccess() {
//游戏收到该注销回调,需要退出当前账号,回到初始界面后,调用SDK的登录接口
PoolSdkLog.logInfo("游戏中logoutSuccess");
login();
}
});
```
### 2.9、切换账号接口
说明: 该接口包含有注销和切换账号两种方式, 游戏需要根据同时根据两种接口的逻辑进行处理和调用
1、当渠道走的是注销逻辑则成功后会回调到注销监听中,游戏可在对应回调中进行注销逻辑处理
2、当渠道走的是切换账号逻辑时,在切换账号成功后会回调到登录成功的监听结果中
#### 2.9.1、方法定义
```java
public static boolean hasLogout();
public static void logout(final Activity paramActivity) ;
public static boolean hasSwitchAccount();
public static void switchAccount(final Activity paramActivity);
```
#### 2.9.2、 代码示例
```java
/**
* 处理是否显示切换账号入口
*/
if(PoolSdkHelper.hasLogout() || PoolSdkHelper.hasSwitchAccount()){
//满足此条件时游戏显示切换账号功能入口
}else{//不存在切换账号接口,游戏可自行处理对应逻辑
}
/**
* 切换账号功能实现
*/
if(PoolSdkHelper.hasLogout()){
//结果在注销监听回调中处理(参考文档2.8、注销登录监听接口)
PoolSdkHelper.logout(paramActivity);
}else if(PoolSdkHelper.hasSwitchAccount()){
//切换账号结果在登陆回调中处理
PoolSdkHelper.switchAccount(paramActivity);
}
```
#### 2.10、退出游戏接口(必接)
说明:在游戏需要退出时调用,调用此接口时需先用 PoolSdkHelper.hasExitDialog() 判断 sdk 是否有退出界
面,为 true表示有退出界面需调用 showExitDialog()显示退出界面,为 false 时表示没有退出界面,游戏需自己处
理退出逻辑且在确认 游戏退出前调用 PoolSdkHelper.exitGame 通知 SDK 游戏要退出 (具体可参照 Demo 示例)
#### 2.10.1、方法定义
```java
public static void showExitDialog(final PoolExitDialogListener exitDialogListener)
```
#### 2.10.2、参数说明
| 参数 | 说明 |
| ------------------ | ------------------------------ |
| exitDialogListener | 退出结果回调监听,需实现 onDialogResult 方法 |
```java
2.9.3、代码示例
@Override
public boolean dispatchKeyEvent(KeyEvent pKeyEvent) {
if (pKeyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK
&& pKeyEvent.getAction() == KeyEvent.ACTION_DOWN) {
if (PoolSdkHelper.hasExitDialog()) {
PoolSdkHelper.showExitDialog(new PoolExitDialogListener() {
@Override
public void onDialogResult(int code, String msg) {
// TODO Auto-generated method stub
switch (code) {
case PoolSDKCode.EXIT_SUCCESS:// 退出成功游戏处理自己退出逻辑
finish();
// System.exit(0);
break;
case PoolSDKCode.EXIT_CANCEL:// 取消退出
break;
default:
break;
}
}
});
} else {
// TODO: 调用游戏的退出界面
showGameExitTips();
}
return false;
}
return super.dispatchKeyEvent(pKeyEvent);
}
```
### 2.11、Android 生命周期接口(必接) ###
`注意:权限返回接口为必接接口,接入代码 PoolSdkHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);`
说明:在游戏 Activity 的 onStart、onPause、onResume、 onStop、onDestroy、onRestart、onNewIntent、 onActivityResult、onConfigurationChanged、onSaveInstanceState、onRestoreInstanceState、onWindowFocusChanged、onWindowAttributesChanged、onRequestPermissionsResult中分别调用对应的接口
```java
2.10.1 代码示例
@Override
public void onStart() {
super.onStart();
PoolSdkHelper.onStart();
}
@Override
public void onStop() {
super.onStop();
PoolSdkHelper.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
PoolSdkHelper.onDestroy();
}
@Override
public void onResume() {
super.onResume();
PoolSdkHelper.onResume();
}
@Override
public void onPause() {
super.onPause();
PoolSdkHelper.onPause();
}
@Override
public void onRestart() {
super.onRestart();
PoolSdkHelper.onRestart();
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
PoolSdkHelper.onNewIntent(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
PoolSdkHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
PoolSdkHelper.onConfigurationChanged(newConfig);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
PoolSdkHelper.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
PoolSdkHelper.onRestoreInstanceState(savedInstanceState);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
PoolSdkHelper.onWindowFocusChanged(hasFocus);
}
@Override
public void onWindowAttributesChanged(LayoutParams params) {
// TODO Auto-generated method stub
super.onWindowAttributesChanged(params);
PoolSdkHelper.onWindowAttributesChanged(params);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// TODO Auto-generated method stub
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PoolSdkHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
```
### 2.12、扩展接口(可选) ###
说明:该接口为扩展的万能接口,留作备用,目前游戏方可以不接入
2.11.1、方法定义
public static void expansionInterface(final String paramCustom,final PoolExpansionListener poolExpansionListener)
2.11.2、参数说明
| 参数 | 说明 |
| --------------------- | -------------------- |
| paramCustom | 自定义参数 |
| poolExpansionListener | 方法回调参数,实现onSuccess方法 |
### 2.13、获取渠道包标识(可选) ###
```
对应打包工具的 渠道号
接口名称:PoolSdkHelper.getGameChannelId()
接口说明:获取在企业平台配置的渠道标识,返回类型为 String
对应打包工具的 渠道标识1
接口名称:PoolSdkHelper. getChannelParameter1 ()
接口说明:获取在企业平台配置的渠道参数 1,返回类型为 String
对应打包工具的 渠道标识2
接口名称:PoolSdkHelper. getChannelParameter2 ()
接口说明:获取在企业平台配置的渠道参数 2,返回类型为 String
```
### 2.14、获取渠道自定义参数(可选) ###
接口名称:PoolSdkHelper.getCustomValue()
接口说明:获取在企业平台配置的渠道自定义参数,返回类型为 String
### 2.15、打开论坛、社区接口(选接) ###
接口名称:PoolSkHelper.openForum()
接口说明:打开渠道的论坛界面
### 2.16、聊天统计(选接) ###
说明:在用户发送聊天信息时调用该接口
```java
public static void reportChat(final String content,String typefinal String accountId,final String accountName, final int level, final String serverId,final String serverName)
```
参数说明:
参数 |说明
------------ | -------------
content | 聊天内容
type | 聊天类型(世界,私聊等)
accountId | 角色ID
accountName | 角色名称
level | 角色等级
serverId | 服务器ID
serverName | 服务器名称
### 2.18、事件上报接口(必接,需要跟运营确认需要接入的统计事件)
```
/**
* @param context 传getApplicationContext()
* @param eventType 事件类型(PoolEventType类中获取对应事件类型)
* @param eventValue 参数值(充值时传PoolEventParameterName属性变量键值对)
*/
public static void trackEvent(Context context, String eventType, Map<String, Object> eventValue);
```
游戏许上报的事件类型有:
```
PoolEventType类中对应的类型:
POOL_RES_LOADED 资源加载完毕
POOL_TUTORIAL_COMPLETION 新手流程结束
POOL_FIRST_DAY_CHECKPOINT_TO_VALUE 副本关卡(创角首日达到的某个关卡)(具体关卡cp跟渠道沟通)
POOL_ENTER_PARTY 加入公会/联盟等
POOL_FIRST_DAY_UPDATE_TO_LEVEL1 首日更新到某个等级(具体等级cp跟渠道沟通)
POOL_UPDATE_TO_LEVEL 更新到某个等级
POOL_FIRST_RECHARGE 首冲
POOL_PAY_SUCCESS 充值成功
POOL_FIRST_DAY_RECHARGE_TO_VALUE 首日充值达到某个值时(具体数值cp跟渠道沟通)
POOL_BUY_MOUTH_CARD 购买月卡
POOL_BIG_RECHARGE 累积充值达到某个数额(具体数值cp跟渠道沟通)
POOL_RETAINED_2_DAY 领取七天礼包的第二天奖励时
POOL_RETAINED_3_DAY 领取七天礼包的第三天奖励时
POOL_RETAINED_7_DAY 领取七天礼包的第七天奖励时
POOL_FIRST_PURCHASE_FUND 首次成长基金充值
POOL_VIP_LEVEL_TO_TARGET_LEVEL vip达到某个等级
POOL_BUY_ANNUAL_CARD 购买年卡
POOL_FIRST_RECHARGE_9999 首次储值99.99美元
```
代码示例:
```
充值成功类型例子:
Map<String,Object> valueMap = new HashMap<>();
valueMap.put(PoolEventParameterName.POOL_ORDER_ID,System.currentTimeMillis()+"");//订单号
valueMap.put(PoolEventParameterName.POOL_CURRENCY,"USD");//货币类型 USD:美元 CNY:人民币
valueMap.put(PoolEventParameterName.POOL_PRICE,6);//充值金额
PoolSdkHelper.trackEvent(getApplicationContext(),PoolEventType.POOL_PAY_SUCCESS,valueMap);
其他类型例子:
PoolSdkHelper.trackEvent(getApplicationContext(), PoolEventType.POOL_RES_LOADED,null);
```
### 2.19、商品查询接口(用于根据不同的谷歌商店地区显示当地货币价格)(查询结果返回在初始化回调中,具体可查看初始化接口或者Demo)
```java
/**
* 拓展方法
*
* @param funcName 方法名(查询商品接口传"queryWithProducts")
* @param param 传递参数(此处Map传键为商品ID值为空)
* @return
*/
public static String callFunc(String funcName, Map<Object, Object> param) {
```
代码示例:
```java
Map productMap = new HashMap<Object, Object>();
productMap.put("商品ID", "");
productMap.put("商品ID", "");
PoolSdkHelper.callFunc("queryWithProducts", productMap);
```
### 2.20、客服中心接口(选接)
- 判断是否有客服接口
```java
/** * 是否存在接口
* @param functionName (客服中心传"hasAssistantCenter")
* @return true:为存在 false:不存在 */
public static boolean hasFunction(String functionName){
}
```
- 客服接口
```java
/** *
* @param funcName 方法名 (客服中心传"openAssistantCenter")
* @param param 传空Map
* @return
*/
public static String callFunc(String funcName, Map<Object, Object> param){}
```
- 例子:
```java
if(PoolSdkHelper.hasFunction("hasAssistantCenter"))
{//存在客服接口
Map<Object,Object> map = new HashMap<>(); PoolSdkHelper.callFunc("openAssistantCenter",map);
}
```
# 3、游戏自测相关 #
### 3.1、接入环境下调用登录sdk会有默认测试账号进行登录,游戏会直接收到登录回调数据 ###
- 成功收到登录回调,与服务端校验成功进入游戏
![](http://i.imgur.com/tHxu8mx.png)
### 3.2、游戏点击充值在接入环境下sdk会直接进行充值数据校验,点击充值后游戏可查看服务端是否收到充值结果通知 ###
- 后台配置正确的 `游戏充值回调地址和白名单ip` 可以进行母包充值测试是否到账
# 4、母包 #
```
4.1、接入公共 SDK 编译生成的 apk 即为打包工具使用的空白母包
```
# 6.游戏使用多dex打包需要注意的点
1、如果游戏接入公共SDK后使用了多dex打包,请确保公共SDK保持在第一个classes.dex文件
在defaultConfig中配置multiDexKeepProguard file('maindexlist.pro')
```xml
-keep class com.gzpublic.app.sdk.*
-keep class com.gzpublic.app.sdk.framework.*
-keep class com.gzpublic.app.sdk.wxapi.*
-keep class com.gzpublic.app.application.*
```
2、如果母包需要每次出包Manifest中的配置改成相应的包名字段(例如推送和Provider)
则将包名写成 originPackageTag 打包工具会自动替换成目标包名
```xml
android:authorities="com.xxx.provider"
<!-- 写为下面这样既可 -->
android:authorities="originPackageTag.provider"
```
\ No newline at end of file
# 公共SDK扩展接口接入文档 #
## 接入必读
## 接入必读(本文档接口都为选接,主要用于海外SDK)
1.公共获取状态接口(用于获取各种状态)
`public static boolean hasFunction(String functionName)`
......
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type