Toggle navigation
Toggle navigation
This project
Loading...
Sign in
public_service
/
public_sdk_android
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
lizhihui
2021-11-16 07:29:11 +0000
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
b6db401f5d159b05c298d1ac75c2b2439ebbc3f8
b6db401f
1 parent
15c9d8fc
Update 公共SDK客户端接入文档.md
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
61 additions
and
741 deletions
doc/公共SDK客户端接入文档.md
doc/公共SDK客户端接入文档.md
View file @
b6db401
# 公共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
);
}
}
```
...
...
Please
register
or
login
to post a comment