lizhihui

Update 公共SDK客户端接入文档.md

# 公共SDK接入文档 #
## 接入必读
`注意!cp需在获取以下权限收到回调后才能调用公共的其他api接口
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_PHONE_STATE`
注意!
游戏如有需要获取以下权限的,收到权限回调之后再调用公共SDK的初始化接口
如无需要获取以下权限,则直接调用公共SDK的初始化接口
```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
```
`
接入公共SDK测试没问题后游戏打出一个母包,需要上哪个渠道使用打包工具进行打对应渠道包。
接入公共SDK测试没问题后游戏打出为 母包 ,后续使用打包工具打对应 渠道包
`
## 1、开发环境搭建 ##
......@@ -17,22 +22,22 @@ android.permission.READ_PHONE_STATE`
#### 1.2、复制SDK压缩包中assets目录下的所有内容到游戏工程的assets目录 ####
- 将游戏中的闪屏图片放到assets中poolsdk_splash目录下(选用,图片文件名任意,最多支持2张闪屏)
- 将assets中的poolsdk.xml文件替换(具体文件请与相关人员申请)
- 将assets中的poolsdk.xml配置文件替换(具体文件请与运营人员申请)
#### 1.3、修改游戏工程的AndroidManifest.xml(可以参照复制Demo中 AndroidManifest.xml文件) ####
#### 1.3、修改游戏工程的AndroidManifest.xml ####
- 添加声明权限:
- 添加声明权限:(因国家相关法规规定,不能未向用户告知同意收集用户信息,所以游戏自行处理自己必要的权限申请,渠道SDK自身需要的权限由渠道自行处理,以下非必要的权限可以不写)
```
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- 必要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 非必要 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 非必要 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 非必要 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 非必要 -->
```
### 2、功能接口 (注意:以下所有接口都必须在 SDK 初始化完成之后才能调用) ###
### 2、功能接口 (注意:以下所有接口都必须在游戏收到 SDK 初始化完成之后才能调用) ###
#### 2.1、继承 PoolSDKApplication(必接)
......@@ -49,7 +54,6 @@ android.permission.READ_PHONE_STATE`
public class XXXXApplication extends PoolSDKApplication {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
}
......@@ -75,7 +79,6 @@ android.permission.READ_PHONE_STATE`
PoolSdkHelper.init(this, new PoolSDKCallBackListener() {
@Override
public void poolSdkCallBack(int code, String msg) {
// TODO Auto-generated method stub
PoolSdkLog.logInfo("callback: code:" + code + "msg:" + msg);
switch (code) {
case PoolSDKCode.POOLSDK_INIT_SUCCESS:// 初始化成功
......@@ -83,22 +86,8 @@ android.permission.READ_PHONE_STATE`
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;
}
}
});
......@@ -166,7 +155,7 @@ public static void submitRoleData(final PoolRoleInfo poolRoleInfo,final PoolRole
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 为关卡结束 ;|
| 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 | 角色等级 (请用数字) |
......@@ -220,6 +209,8 @@ public static void submitRoleData(final PoolRoleInfo poolRoleInfo,final PoolRole
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);//改名
......@@ -253,15 +244,15 @@ public static void pay(final PoolPayInfo poolPayInfo,final PoolPayListener poolP
支付信息实体类(PoolPayInfo)字段说明
| 参数 | 说明 |
| ----------- | ------------------- |
| amount | 金额(单位元,必须大于 0,需传入整型数据`传小数时兑换比例和金额相乘为整数`) |
| productId | 商品 ID(如果没有可以传空字符 串) |
| amount | 金额(单位元,必须大于 0,需传入整型数据`传小数时兑换比例和金额相乘为整数(即金额传 "0.99" 兑换比例传 "100")`) |
| productId | 商品 ID(如果没有可以传空字符串) |
| productName | 商品描述 |
| roleid | 角色 id |
| rolelevel | 角色等级 |
| roleName | 角色名称 |
| serverId | 服务器 id |
| serverName | 服务器名称 |
| exchange | 游戏币与人民币(元)的兑换比例 `单机游戏时直接传对应购买的道具数量或游戏币数量` |
| exchange | 游戏币与人民币(元)的兑换比例(一般填10) `单机游戏时直接传对应购买的道具数量或游戏币数量` |
| custom | 自定义透传参数,通过回调函数原样返回 |
......@@ -292,7 +283,7 @@ public static void pay(final PoolPayInfo poolPayInfo,final PoolPayListener poolP
poolPayInfo.setExchange("10");
// 自定义参数
poolPayInfo.setCustom("我是自定义参数");
// 充值回调以服务端回调为准
// 充值回调以服务端回调为准,部分渠道客户端SDK无回调
PoolSdkHelper.pay(poolPayInfo, new PoolPayListener() {
@Override
public void onPaySuccess(String paramCustom) {
......@@ -316,6 +307,11 @@ public static void pay(final PoolPayInfo poolPayInfo,final PoolPayListener poolP
```java
public static boolean hasChannelCenter()
```
```java
PoolSdkHelper.hasChannelCenter();//判断渠道SDK有无用户中心
```
#### 2.7、用户中心接口(必接)
说明:打开渠道用户中心界面
......@@ -335,10 +331,8 @@ public static void openChannelCenter()
* 如果有的话,游戏中需要添加按钮,点击按钮调用PoolSdkHelper.openChannelCenter();
* 如果没有,则不需要显示按钮,也不用调用下面的接口
*/
private void channelCenter() {
PoolSdkHelper.openChannelCenter();
}
PoolSdkHelper.openChannelCenter();
```
#### 2.8、注销登录监听接口
......@@ -362,9 +356,10 @@ public static void setLogoutCallback(final PoolLogoutListener poolLogoutListener
PoolSdkHelper.setLogoutCallback(new PoolLogoutListener() {
@Override
public void onLogoutSuccess() {
// TODO: 此处处理SDK注销成功后的逻辑
login();
//游戏收到该注销回调,需要退出当前账号,回到初始界面后,调用SDK的登录接口
PoolSdkLog.logInfo("游戏中logoutSuccess");
login();
}
});
```
......@@ -571,21 +566,28 @@ public static void showExitDialog(final PoolExitDialogListener exitDialogListene
| poolExpansionListener | 方法回调参数,实现onSuccess方法 |
### 2.13、获取渠道包标识(可选) ###
```
对应打包工具的 渠道号
接口名称:PoolSdkHelper.getGameChannelId()
接口说明:获取在企业平台配置的渠道标识,返回类型为 String
对应打包工具的 渠道标识1
接口名称:PoolSdkHelper. getChannelParameter1 ()
接口说明:获取在企业平台配置的渠道参数 1,返回类型为 String
接口名称:PoolSdkHelper. getChannelParameter2 ()
对应打包工具的 渠道标识2
接口名称:PoolSdkHelper. getChannelParameter2 ()
接口说明:获取在企业平台配置的渠道参数 2,返回类型为 String
```
### 2.14、获取渠道自定义参数(可选) ###
接口名称:PoolSdkHelper.getCustomValue()
接口说明:获取在企业平台配置的渠道自定义参数,返回类型为 String
### 2.15、打开论坛、社区接口 ###
### 2.15、打开论坛、社区接口(选接) ###
接口名称:PoolSkHelper.openForum()
接口说明:打开渠道的论坛界面
### 2.16、聊天统计 ###
### 2.16、聊天统计(选接) ###
说明:在用户发送聊天信息时调用该接口
......@@ -604,121 +606,22 @@ level | 角色等级
serverId | 服务器ID
serverName | 服务器名称
### 2.17、实名认证(防沉迷)接口 ###
### 2.17、实名认证(防沉迷)接口(必接) ###
说明:游戏方需要渠道SDK实名认证信息时调用(请在登陆成功后再调用)
- 显示实名页面功能
```java
/** 是否存在接口
* @param functionName (是否有实名页面界面接口传"hasRealNameVerifyView")
* @return true:为存在 false:不存在 */
public static boolean hasFunction(String functionName){
}
//回调结果到初始化监听接口中
public void poolSdkCallBack(int code, String msg) {
if(code== PoolSDKCode.POOLSDK_EXTENDS_CODE1)//实名认证成功才有回调
{
//msg为生日 格式(与查询的结果一样):19900101
}
}
/** *
* 显示实名页面
* @param funcName 方法名 (显示实名认证页面接口"showRealNameVerifyView")
* @param param 传空Map
* @return
*/
public static String callFunc(String funcName, Map<Object, Object> param){}
```
- 查询实名状态结果
- 查询渠道实名状态结果(请游戏在收到登录成功回调后调用)
```java
public String verifyRealName(Activity paramActivity)
```
默认返回 "" (空字符串)为渠道SDK没有实名认证接口,游戏方需要自己实现该功能
返回 "0" (字符串)为渠道有实名未认证,但该玩家未认证
如果有实名认证接口,渠道有返回生日则返回生日(如"19900101")
没有请运营跟渠道确认,到底返回成年日期还是未成年日期
### 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美元
```
- 默认返回 "" (空字符串)为渠道SDK没有实名认证接口,游戏方需要自己实现该功能(或者接入公共防沉迷SDK)
- 返回 "0" (字符串)为渠道有实名未认证,但该玩家未认证
代码示例:
```
充值成功类型例子:
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);
```
- 如果有实名认证接口,渠道有返回生日则返回生日(如"19900101")
### 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、客服中心接口
### 2.20、客服中心接口(选接)
- 判断是否有客服接口
......@@ -750,7 +653,7 @@ PoolSdkHelper.trackEvent(getApplicationContext(), PoolEventType.POOL_RES_LOADED,
}
```
# 3、自测用例 #
# 3、游戏自测相关 #
### 3.1、接入环境下调用登录sdk会有默认测试账号进行登录,游戏会直接收到登录回调数据 ###
......@@ -760,7 +663,7 @@ PoolSdkHelper.trackEvent(getApplicationContext(), PoolEventType.POOL_RES_LOADED,
### 3.2、游戏点击充值在接入环境下sdk会直接进行充值数据校验,点击充值后游戏可查看服务端是否收到充值结果通知 ###
- 后台配置正确的游戏充值回调地址可以进行充值测试是否到账
- 后台配置正确的 `游戏充值回调地址和白名单ip` 可以进行母包充值测试是否到账
# 4、母包 #
```
......@@ -810,602 +713,19 @@ e.printStackTrace();
# 6.游戏使用多dex打包需要注意的点
1、如果游戏接入公共SDK后使用了多dex打包,请确保公共SDK保持在第一个classes.dex文件
在defaultConfig中配置multiDexKeepProguard file('maindexlist.pro')
```java
-keep class com.gzyouai.fengniao.sdk.*
-keep class com.gzyouai.fengniao.sdk.framework.*
-keep class com.gzyouai.fengniao.sdk.wxapi.*
-keep class com.gzyouai.publicsdk.application.*
```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"
```
# 7. 完整的接入demo
```java
package com.youai.foolsdk.demo;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Application;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.gzpublic.app.sdk.framework.PoolEventParameterName;
import com.gzpublic.app.sdk.framework.PoolEventType;
import com.gzpublic.app.sdk.framework.PoolExitDialogListener;
import com.gzpublic.app.sdk.framework.PoolExitListener;
import com.gzpublic.app.sdk.framework.PoolExpansionListener;
import com.gzpublic.app.sdk.framework.PoolLoginInfo;
import com.gzpublic.app.sdk.framework.PoolLoginListener;
import com.gzpublic.app.sdk.framework.PoolLogoutListener;
import com.gzpublic.app.sdk.framework.PoolPayInfo;
import com.gzpublic.app.sdk.framework.PoolPayListener;
import com.gzpublic.app.sdk.framework.PoolPayOrderConfirmHandler;
import com.gzpublic.app.sdk.framework.PoolReport;
import com.gzpublic.app.sdk.framework.PoolRoleInfo;
import com.gzpublic.app.sdk.framework.PoolRoleListener;
import com.gzpublic.app.sdk.framework.PoolSDKCallBackListener;
import com.gzpublic.app.sdk.framework.PoolSDKCode;
import com.gzpublic.app.sdk.framework.PoolSdkConfig;
import com.gzpublic.app.sdk.framework.PoolSdkHelper;
import com.gzpublic.app.sdk.framework.PoolSdkLog;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
public class AppActivity extends Activity implements OnClickListener {
//新的view
private Button btLogin;
private Button btEnterGame;
private Button btPay;
private Button btLogout;
private Button btSubRoleInfo;
private Button btOpenChannel;
private Button btSwitchAcc;
private Button btOpenBbs;
private Button btQueryProducts;
private Button pb_bt_verifyname;
private Bundle saveBundle;
//提示LOG
private TextView txMsg,txSdkMsg;
private Activity mContext;
private PoolPayListener mPoolPayListener = new PoolPayListener() {
@Override
public void onPaySuccess(String paramCustom) {//支付回调以服务端通知为准
// TODO Auto-generated method stub
//[{"orderId":"20180116114151740535D825","state":0,"productId":"1","productName":"金币","amout":0}]
if(paramCustom == null || paramCustom.length() <= 0)
{
PoolSdkLog.logError("paysuccess data error :" + paramCustom);
return;
}
try {
PoolSdkLog.logInfo("paySuccess:" + paramCustom);
JSONArray jsonArray = new JSONArray(paramCustom);
StringBuilder orderIds = new StringBuilder();
int length = jsonArray.length();
for (int i = 0; i < length; i++) {
JSONObject jb = jsonArray.getJSONObject(i);
String orderId = jb.getString("orderId");
orderIds.append(orderId);
if(i != length -1) {//最后一项不加分割符
orderIds.append(",");
}
}
PoolSdkHelper.paymentSuccess(AppActivity.this, orderIds.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
upTx("支付成功回调:" + paramCustom);
}
@Override
public void onPayFailed(String paramCustom, String errorMsg) {
// TODO Auto-generated method stub
System.out.println("支付失败回调:" + paramCustom + "; errorMsg:"
+ errorMsg);
upTx("支付失败回调:" + paramCustom + "; errorMsg:"
+ errorMsg);
}
};
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PoolSdkHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
init(saveBundle);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
saveBundle = savedInstanceState;
int layoutId = getResources().getIdentifier(
"public_sdk_self_test", "layout", getPackageName());
setContentView(layoutId);
mContext = this;
initView();
PoolSdkLog.setIsShowLog(true);
PoolSdkConfig.readPoolSdkConfigData(this);
if(getApplicationInfo().targetSdkVersion >= 23 && Build.VERSION.SDK_INT >= 23){
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {//不需要权限直接调用init
this.init(savedInstanceState);
}
txSdkMsg.setText("sdksimplename:"+ PoolSdkConfig.getConfigByKey("sdksimplename")
+"\nsdkversioncode:"+PoolSdkConfig.getConfigByKey("sdkversioncode")
+"\ngamesimplename:"+PoolSdkConfig.getConfigByKey("gamesimplename")
+"\nlogincheckurl:"+PoolSdkConfig.getConfigByKey("logincheckurl")
);
}
private void init( Bundle savedInstanceState){
PoolSdkHelper.init(this, new PoolSDKCallBackListener() {
@Override
public void poolSdkCallBack(int code, String msg) {
PoolSdkLog.logInfo("poolSdkCallBack:code:" + code + ",msg:" + msg);
upTx("poolSdkCallBack:code:" + code + ",msg:" + msg);
switch (code) {
case PoolSDKCode.POOLSDK_INIT_SUCCESS:// 初始化成功
PoolSdkLog.logInfo("游戏中收到初始化成功回调");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
login();
}
}, 1000);
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;
case PoolSDKCode.POOLSDK_EXTENDS_CODE1://实名认证成功才有回调
//msg为生日
break;
default:
break;
}
}
},savedInstanceState);// init(this);// this为游戏的activity对象
PoolSdkHelper.setPayListener(mPoolPayListener);
PoolSdkHelper.setLogoutCallback(new PoolLogoutListener() {
@Override
public void onLogoutSuccess() {
// TODO: 此处处理SDK登出的逻辑
PoolSdkLog.logInfo("游戏中收到logoutSuccess回调");
login();
}
});
PoolSdkHelper.trackEvent(getApplicationContext(), PoolEventType.POOL_RES_LOADED, null);
}
@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) {
super.onConfigurationChanged(newConfig);
PoolSdkHelper.onConfigurationChanged(newConfig);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
PoolSdkHelper.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
PoolSdkHelper.onRestoreInstanceState(savedInstanceState);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
PoolSdkHelper.onWindowFocusChanged(hasFocus);
}
@Override
public void onWindowAttributesChanged(LayoutParams params) {
super.onWindowAttributesChanged(params);
PoolSdkHelper.onWindowAttributesChanged(params);
}
@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) {
switch (code) {
case PoolSDKCode.EXIT_SUCCESS:
// 退出成功游戏处理自己退出逻辑
PoolSdkLog.logInfo("游戏调用自己退出逻辑");
finish();
System.exit(0);
break;
case PoolSDKCode.EXIT_CANCEL:
// 取消退出
PoolSdkLog.logInfo("收到取消退出回调");
break;
default:
break;
}
}
});
} else {
// TODO: 调用游戏的退出界面
showGameExitTips();
}
return false;
}
return super.dispatchKeyEvent(pKeyEvent);
}
private void showGameExitTips() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
int ic_dialog_alert_id = getRedIdByName("ic_dialog_alert", "drawable");
dialog.setIcon(ic_dialog_alert_id);
dialog.setTitle("提示");
dialog.setMessage("是否退出游戏?");
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PoolSdkHelper.exitGame(new PoolExitListener() {
@Override
public void onExitGame() {
finish();
}
});
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
}
private int getRedIdByName(String resName, String resType) {
return getResources().getIdentifier(resName, resType, getPackageName());
}
private void initView(){
btLogin = (Button) findViewById(getRedIdByName("pb_bt_login", "id"));
btEnterGame = (Button) findViewById(getRedIdByName("pb_bt_entergame", "id"));
btPay = (Button) findViewById(getRedIdByName("pb_bt_pay", "id"));
btLogout = (Button) findViewById(getRedIdByName("pb_bt_logout", "id"));
btSubRoleInfo = (Button) findViewById(getRedIdByName("pb_bt_subrole", "id"));
btOpenChannel = (Button) findViewById(getRedIdByName("pb_bt_openchannel", "id"));
btSwitchAcc = (Button) findViewById(getRedIdByName("pb_bt_switchacc", "id"));
btOpenBbs = (Button) findViewById(getRedIdByName("pb_bt_openbbs", "id"));
btQueryProducts = findViewById(getRedIdByName("pool_query_products_id","id"));
pb_bt_verifyname = (Button) findViewById(getRedIdByName("pb_bt_verifyname", "id"));
txMsg = (TextView) findViewById(getRedIdByName("tx_msg", "id"));
txSdkMsg = (TextView) findViewById(getRedIdByName("tx_sdk_msg", "id"));
btLogin.setOnClickListener(this);
btEnterGame.setOnClickListener(this);
btPay.setOnClickListener(this);
btLogout.setOnClickListener(this);
btSubRoleInfo.setOnClickListener(this);
btOpenChannel.setOnClickListener(this);
btSwitchAcc.setOnClickListener(this);
btOpenBbs.setOnClickListener(this);
btQueryProducts.setOnClickListener(this);
pb_bt_verifyname.setOnClickListener(this);
}
public void yaOnClick(View view) {
}
@Override
public void onClick(View view) {
//新view
if (view == btLogin) {
login();
}else if (view == btEnterGame) {
submitRoleData(10,PoolRoleInfo.Type_EnterGame);
//PoolReport.reportEnterGame("chufan","角色名", 12, "201","服务器名");
}else if (view == btPay) {
pay();
}else if (view == btLogout) {
logout();
}else if (view == btSubRoleInfo) {
submitRoleData(11,PoolRoleInfo.Type_RoleUpgrade);
}else if (view == btOpenChannel) {
channelCenter();
}else if (view == btSwitchAcc) {
switchAccount();
}else if (view == btOpenBbs) {
trackEvent();
}else if(view == btQueryProducts){
queryProducts();
}else if (view == pb_bt_verifyname){
Toast.makeText(this,PoolSdkHelper.verifyRealName(this),Toast.LENGTH_SHORT).show();
}
}
private void trackEvent(){
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_RES_LOADED,valueMap);
}
private void logout(){
// if(PoolSdkHelper.hasLogout()){
// PoolSdkHelper.logout(this);//结果回调通知到PoolLogoutListener
// }
}
private void upTx(final String msg){
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
txMsg.setText(msg);
}
});
// new Handler().post(new Runnable() {
//
// @Override
// public void run() {
// txMsg.setText(msg);
// }
// });
}
private void login() {
PoolSdkLog.logError("调用login");
PoolSdkHelper.login("登录自定义字段", new PoolLoginListener() {
@Override
public void onLoginSuccess(PoolLoginInfo poolLoginInfo) {
final String userType = poolLoginInfo.getUserType();
final String timestamp = poolLoginInfo.getTimestamp();
final String serverSign = poolLoginInfo.getServerSign();
final String openId = poolLoginInfo.getOpenID();
// TODO: 把以上信息发送给游戏服务端做登录校验,需要其他信息请从poolLoginInfo对象中获取
System.out.println("登录成功回调:userType = " + userType
+ "; timestamp = " + timestamp + "; serverSign = "
+ serverSign + "; openId = " + openId);
upTx("登录成功回调:userType = " + userType
+ "; timestamp = " + timestamp + "; serverSign = "
+ serverSign + "; openId = " + openId);
}
@Override
public void onLoginFailed(final String errorMsg) {
System.out.println("登录失败回调 :" + errorMsg);
upTx("登录失败回调 :" + errorMsg);
}
});
PoolPayOrderConfirmHandler.getInstance(this, 2000, 1000).startOrderConfirmOp(mPoolPayListener);
}
private void pay() {
final PoolPayInfo poolPayInfo = new PoolPayInfo();
/********************************************
* 以下所有字段都是必填项
*/
// 设置充值金额,单位“元”
poolPayInfo.setAmount("100");
// 服务器id
poolPayInfo.setServerID("1209");
// 服务器名
poolPayInfo.setServerName("我是服务器名");
// 角色id
poolPayInfo.setRoleID("123456");
// 角色名
poolPayInfo.setRoleName("我是角色名");
// 角色等级
poolPayInfo.setRoleLevel("10");
// 商品ID
poolPayInfo.setProductID("1");
// 商品名称
poolPayInfo.setProductName("金币");
// 商品描述
poolPayInfo.setProductDesc("购买金币");
// 兑换比例
poolPayInfo.setExchange("10");
// 自定义参数
poolPayInfo.setCustom("我是自定义参数");
// TODO Auto-generated method stub
PoolSdkHelper.pay(poolPayInfo, mPoolPayListener);
}
/**
* 提交角色数据 该接口需要在3个地方调用
*
* 1、登录游戏主场景 2、创建角色 3、角色升级
*/
private void submitRoleData(int level,String callType) {
/********************************************
* 以下所有字段都是必填项
*/
final PoolRoleInfo poolRoleInfo = new PoolRoleInfo();
poolRoleInfo.setRoleID("123456");
poolRoleInfo.setRoleLevel(level+"");
poolRoleInfo.setRoleSex("0");
poolRoleInfo.setRoleName("我是角色名");
poolRoleInfo.setServerID("1209");
poolRoleInfo.setServerName("我是服务器名");
poolRoleInfo.setCustom("角色创建时间");
poolRoleInfo.setRoleCTime((long)1509331962);//角色创建时间(秒)
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);//角色升级
// 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("提交角色数据成功:" + poolRoleInfo.verboseInfo());
upTx("提交角色数据成功:" + poolRoleInfo.verboseInfo());
}
});
}
/**
* 用户中心
*
* 游戏方先调用PoolSdkHelper.hasChannelCenter()获取是否有用户中心,
* 如果有的话,游戏中需要添加按钮,点击按钮调用PoolSdkHelper.openChannelCenter();
* 如果没有,则不需要显示按钮,也不用调用下面的接口
*/
private void channelCenter() {
PoolSdkHelper.openChannelCenter();
}
/**
* 切换帐号
*/
private void switchAccount() {
if(PoolSdkHelper.hasLogout()){
PoolSdkHelper.logout(this);//注销成功后结果回调通知到PoolLogoutListener中
}else if(PoolSdkHelper.hasSwitchAccount()){
PoolSdkHelper.switchAccount(this);//切换成功后回回调结果到登录成功通知中(与登录通知数据一样)
}else{//渠道不存在注销和切换账号接口,游戏可自定处理逻辑
}
}
/**
* 扩展接口
*/
private void expansionInterface() {
PoolSdkHelper.expansionInterface("自定义参数", new PoolExpansionListener() {
@Override
public void onSuccess(String paramCustom) {
}
});
}
/**
* 商品查询接口
*/
private void queryProducts(){
PoolSdkLog.logError(PoolSdkHelper.hasFunction("hasQueryWithProducts") + "SSS");
Map productMap = new HashMap<Object,Object>();
productMap.put("productId1","");
productMap.put("productId2","");
PoolSdkHelper.callFunc("queryWithProducts",productMap);
}
}
```
......