xuguohong

重新添加公共sdk接入资料

Showing 75 changed files with 2581 additions and 0 deletions
/demo/Demo_PoolSdk/gen
/demo/Demo_PoolSdk/bin
\ No newline at end of file
- 2019-09-02
- 修改PoolSdk_V2 assets/sdk assets/sdk.zip
- 2019-11-15
- libs修改PoolSdk_V2,YouYuSDK_xxx.jar为191016版本,添加miit_mdid_1.0.10.aar
- assets中添加supplierconfig.json,poolsdk.xml添加styleName字段
- 添加事件上报接口(具体查看接入文档)
- 2019-11-28
- 更新为YouYuSDK_1128.jar版本
- 2019-12-04
- 更新更新PoolSdk_V2包名,将YouYuSDK_xxx.jar替换为AppSdk_xxx.jar,替换assets下的sdk和sdk.zip
- 2019-12-19
- 更新PoolSdk_V2,删除assets中sdk/sdk.zip/sdkconfig.ini 删除AppSdk_xxx.jar,android-support-v4.jar
\ 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"/>
</config>
{
"supplier":{
"vivo":{
"appid":"100215079"
},
"xiaomi":{
},
"huawei":{
},
"oppo":{
}
}
}
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</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" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<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" />
</set>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
\ No newline at end of file
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion '29.0.2'
defaultConfig {
applicationId "com.ssjh.demo"
targetSdkVersion 28
versionCode 2
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
}
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.youai.demo.shenshou">
<!-- 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.GET_TASKS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- SDK end -->
<application
android:name="com.gzpublic.app.sdk.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="portrait"
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 -->
<activity
android:name="com.appsdk.sdk.YouaiSDK"
android:label="youai_sdk"
android:launchMode="singleTask"
android:theme="@android:style/Theme.Dialog" />
<service
android:name="com.appsdk.sdk.YouaiService"
android:enabled="true" >
<intent-filter>
<action android:name="com.youai.sdk.YouaiService" />
</intent-filter>
</service>
<receiver android:name="com.appsdk.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" />
<!-- SDK end -->
</application>
</manifest>
\ 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"/>
</config>
{
"supplier":{
"vivo":{
"appid":"100215079"
},
"xiaomi":{
},
"huawei":{
},
"oppo":{
}
}
}
<?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
package com.youai.foolsdk.demo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
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 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.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;
//提示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);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int layoutId = getResources().getIdentifier(
"public_sdk_self_test", "layout", getPackageName());
setContentView(layoutId);
mContext = this;
initView();
PoolSdkLog.setIsShowLog(true);
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;
default:
break;
}
}
}, savedInstanceState);// init(this);// this为游戏的activity对象
PoolSdkHelper.setPayListener(mPoolPayListener );
PoolSdkHelper.setLogoutCallback(new PoolLogoutListener() {
@Override
public void onLogoutSuccess() {
// TODO: 此处处理SDK登出的逻辑
PoolSdkLog.logInfo("游戏中收到logoutSuccess回调");
login();
}
});
txSdkMsg.setText("sdksimplename:"+ PoolSdkConfig.getConfigByKey("sdksimplename")
+"\nsdkversioncode:"+PoolSdkConfig.getConfigByKey("sdkversioncode")
+"\ngamesimplename:"+PoolSdkConfig.getConfigByKey("gamesimplename")
+"\nlogincheckurl:"+PoolSdkConfig.getConfigByKey("logincheckurl")
);
}
@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"));
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);
}
public void yaOnClick(View view) {
}
@Override
public void onClick(View view) {
//新view
if (view == btLogin) {
login();
}else if (view == btEnterGame) {
PoolReport.reportEnterGame("chufan","角色名", 12, "201","服务器名");
}else if (view == btPay) {
pay();
}else if (view == btLogout) {
logout();
}else if (view == btSubRoleInfo) {
submitRoleData();
}else if (view == btOpenChannel) {
channelCenter();
}else if (view == btSwitchAcc) {
switchAccount();
}else if (view == btOpenBbs) {
trackEvent();
}
}
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() {
/********************************************
* 以下所有字段都是必填项
*/
final PoolRoleInfo poolRoleInfo = new PoolRoleInfo();
poolRoleInfo.setRoleID("123456");
poolRoleInfo.setRoleLevel("10");
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.setCallType(PoolRoleInfo.Type_EnterGame);
// poolRoleInfo.setCallType(PoolRoleInfo.Type_CreateRole);
// poolRoleInfo.setCallType(PoolRoleInfo.Type_RoleUpgrade);
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) {
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
android:orientation="vertical"
android:padding="5dp" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:orientation="vertical" >
<Button
android:id="@+id/pb_bt_login"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="登录" />
<Button
android:id="@+id/pb_bt_entergame"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="进入游戏" />
<Button
android:id="@+id/pb_bt_pay"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="支付" />
<Button
android:id="@+id/pb_bt_logout"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="注销" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:orientation="vertical" >
<Button
android:id="@+id/pb_bt_subrole"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="提交角色数据" />
<Button
android:id="@+id/pb_bt_openchannel"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="打开渠道个人中心" />
<Button
android:id="@+id/pb_bt_switchacc"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="切换账号" />
<Button
android:id="@+id/pb_bt_openbbs"
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="事件上报" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:gravity="center"
/>
<TextView
android:id="@+id/tx_sdk_msg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" />
<TextView
android:id="@+id/tx_msg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Demo_shenshou</string>
</resources>
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
No preview for this file type
#Tue Oct 29 15:45:22 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
include ':app'
# 公共SDK接入文档 #
## 接入必读
`注意!cp需在获取以下权限收到回调后才能调用公共的其他api接口
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_PHONE_STATE`
`
接入公共SDK测试没问题后游戏打出一个母包,需要上哪个渠道使用打包工具进行打对应渠道包。
`
## 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(可以参照复制Demo中 AndroidManifest.xml文件) ####
- 添加声明权限:
```
<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.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() {
// TODO Auto-generated method stub
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) {
// TODO Auto-generated method stub
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;
}
}
});
```
#### 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、提交角色数据接口(必接)
接口说明:游戏提交角色数据接口,该接口需要在以下3中情况下调用:
进入游戏主场景、创建角色、角色升级
**(如果游戏创建角色时没有角色名,需要在用户创建角色名时调用多一次进入游戏统计,否则用户名无法正常统计,投放测试无法通过)**
#### 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 为角色升级 |
| roleId | 角色 Id(请用数字) |
| roleName | 角色名称 |
| roleLevel | 角色等级 (请用数字) |
| roleSex | 角色性别(1 男 0 女,如果角 色不分性别请填写 0) |
| serverId | 服务器 id (请用数字) |
| serverName | 服务器名称 |
| custom | 自定义字段 |
| roleCTime | 角色创建时的时间戳(以秒为单位) (请用数字) |
| partyName | 公会名称 (没有的传 "无") |
| roleType | 角色类型 (没有的传 "无") |
| roleChangeTime | 角色等级变化时的时间戳(以秒为单位) (请用数字) |
| vipLevel | VIP等级 (请用数字,如无请传"0") |
| diamond | 余额 (请用数字,如无请传"0") |
| moneyType | 商品单位 (如 "钻石"、"金币"、"水晶"等) |
```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.setCallType(PoolRoleInfo.Type_EnterGame);//进入游戏(第一次创建角色后需再调用一次进入游戏)
// poolRoleInfo.setCallType(PoolRoleInfo.Type_CreateRole);//创建角色(如果游戏创建角色时没有角色名,需要在用户创建角色名时调用多一次进入游戏统计,否则用户名无法正常统计,投放测试无法通过)
// poolRoleInfo.setCallType(PoolRoleInfo.Type_RoleUpgrade);//角色升级
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,需传入整型数据`传小数时兑换比例和金额相乘为整数`) |
| productId | 商品 ID(如果没有可以传空字符 串) |
| productName | 商品描述 |
| roleid | 角色 id |
| rolelevel | 角色等级 |
| roleName | 角色名称 |
| serverId | 服务器 id |
| serverName | 服务器名称 |
| exchange | 游戏币与人民币(元)的兑换比例 `单机游戏时直接传对应购买的道具数量或游戏币数量` |
| 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("我是自定义参数");
// 充值回调以服务端回调为准
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()
```
#### 2.7、用户中心接口(必接)
说明:打开渠道用户中心界面
#### 2.7.1、方法定义
```java
public static void openChannelCenter()
```
```java
2.7.2、代码示例
/**
* 用户中心
*
* 游戏方先调用PoolSdkHelper.hasChannelCenter()获取是否有用户中心,
* 如果有的话,游戏中需要添加按钮,点击按钮调用PoolSdkHelper.openChannelCenter();
* 如果没有,则不需要显示按钮,也不用调用下面的接口
*/
private void channelCenter() {
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() {
// TODO: 此处处理SDK注销成功后的逻辑
login();
PoolSdkLog.logInfo("游戏中logoutSuccess");
}
});
```
### 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 生命周期接口(必接) ###
说明:在游戏 Activity 的 onStart、onPause、onResume、 onStop、onDestroy、onRestart、onNewIntent、 onActivityResult、onConfigurationChanged、onSaveInstanceState、onRestoreInstanceState、onWindowFocusChanged、onWindowAttributesChanged 中分别调用对应的接口
```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
接口名称:PoolSdkHelper. getChannelParameter1 ()
接口说明:获取在企业平台配置的渠道参数 1,返回类型为 String
接口名称: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.17、实名认证(防沉迷)接口 ###
说明:游戏方需要渠道SDK实名认证信息时调用(请在登陆成功后再调用)
```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_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 领取七天礼包的第七天奖励时
```
代码示例:
```
充值成功类型例子:
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);
```
# 3、自测用例 #
### 3.1、接入环境下调用登录sdk会有默认测试账号进行登录,游戏会直接收到登录回调数据 ###
- 成功收到登录回调,与服务端校验成功进入游戏
![](http://i.imgur.com/tHxu8mx.png)
### 3.2、游戏点击充值在接入环境下sdk会直接进行充值数据校验,点击充值后游戏可查看服务端是否收到充值结果通知 ###
- 后台配置正确的游戏充值回调地址可以进行充值测试是否到账
# 4、母包 #
```
4.1、接入公共 SDK 编译生成的 apk 即为打包工具使用的空白母包
```
# 5、单机无服务端时充值处理 #
### 5.1、设置充值监听,登录接口前调用
```java
PoolSdkHelper.setPayListener(mPoolPayListener );
```
### 5.2、游戏发货成功时调用接口
```java
PoolSdkHelper.paymentSuccess(AppActivity.this, orderIds.toString());
```
代码示例:
```java
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();
}
```
# 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.*
```
2、如果母包需要每次出包Manifest中的配置改成相应的包名字段(例如推送和Provider)
则将包名写成 originPackageTag 打包工具会自动替换成目标包名
```xml
android:authorities="com.xxx.provider"
<!-- 写为下面这样既可 -->
android:authorities="originPackageTag.provider"
```
# 7. 完整的接入demo
```java
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import com.gzyouai.fengniao.sdk.framework.PoolExitDialogListener;
import com.gzyouai.fengniao.sdk.framework.PoolExitListener;
import com.gzyouai.fengniao.sdk.framework.PoolLoginInfo;
import com.gzyouai.fengniao.sdk.framework.PoolLoginListener;
import com.gzyouai.fengniao.sdk.framework.PoolLogoutListener;
import com.gzyouai.fengniao.sdk.framework.PoolPayInfo;
import com.gzyouai.fengniao.sdk.framework.PoolPayListener;
import com.gzyouai.fengniao.sdk.framework.PoolRoleInfo;
import com.gzyouai.fengniao.sdk.framework.PoolRoleListener;
import com.gzyouai.fengniao.sdk.framework.PoolSDKCallBackListener;
import com.gzyouai.fengniao.sdk.framework.PoolSDKCode;
import com.gzyouai.fengniao.sdk.framework.PoolSdkConfig;
import com.gzyouai.fengniao.sdk.framework.PoolSdkHelper;
import com.gzyouai.fengniao.sdk.framework.PoolSdkLog;
public class AppActivity extends Activity {
private Button yaLoginBt;
private Button yaEnterGameBt;
private Button yaPayBt;
private Button yaSubmitRoleDataBt;
private Button yaChannelCenter;
private Button yaLogoutBt;
private Button yaForumBt;
private Button yaSwitchAccountBt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int layoutId = getResources().getIdentifier("public_sdk_self_game_login", "layout", getPackageName());
setContentView(layoutId);
initLoginView();
//================================↓↓↓↓↓公共SDK接入代码示例↓↓↓↓↓==================================
//PoolSdkHelper.isDebug = true;
PoolSdkLog.setIsShowLog(true);
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:
// 收到初始化成功回调才可以调用其他接口
PoolSdkLog.logInfo("SDK初始化成功");
login();
break;
case PoolSDKCode.POOLSDK_INIT_FAIL:
break;
default:
break;
}
}
});
PoolSdkHelper.setLogoutCallback(new PoolLogoutListener() {
@Override
public void onLogoutSuccess() {
//注销账号成功回调在这里通知,游戏收到注销成功,需自行回到登陆界面调用登陆接口
PoolSdkLog.logInfo("游戏中logoutSuccess");
login();
}
});
}
@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);
}
//返回按钮退出游戏示例
@Override
public boolean dispatchKeyEvent(KeyEvent pKeyEvent) {
if (pKeyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK&& pKeyEvent.getAction() == KeyEvent.ACTION_DOWN) {
//点击返回,判断渠道SDK有无退出框
if (PoolSdkHelper.hasExitDialog()) {
PoolSdkHelper.showExitDialog(new PoolExitDialogListener() {
@Override
public void onDialogResult(int code, String msg) {
switch (code) {
case PoolSDKCode.EXIT_SUCCESS:// 退出成功游戏处理自己退出逻辑
finish();
break;
case PoolSDKCode.EXIT_CANCEL:// 取消退出
break;
default:
break;
}
}
});
} else {
//没有则调用游戏的退出界面
showGameExitTips();
}
return false;
}
return super.dispatchKeyEvent(pKeyEvent);
}
/**
* 切换帐号/注销账号
*/
private void switchAccount() {
//游戏请先调用 PoolSdkHelper.hasLogout() PoolSdkHelper.hasSwitchAccount() 接口 判断渠道SDK有没有该接口
if(PoolSdkHelper.hasLogout()){
//如果渠道SDK有注销接口,那么游戏可以添加注销按钮,实现 PoolSdkHelper.logout(this); 结果在注销监听回调中处理
PoolSdkHelper.logout(this);
}else if(PoolSdkHelper.hasSwitchAccount()){
//如果渠道SDK有切换账号接口,那么游戏可以添加切换账号按钮,实现 PoolSdkHelper.switchAccount(this); 新账号结果在登陆回调中处理
PoolSdkHelper.switchAccount(this);
}else{
//直接回到登录界面调用登录
int layoutId = getResources().getIdentifier("public_sdk_self_game_login", "layout", getPackageName());
setContentView(layoutId);
initLoginView();
}
}
private void openForum(){
PoolSdkHelper.openForum();
}
//单独注销按钮 注销账号
private void logout(){
if(PoolSdkHelper.hasLogout()){
PoolSdkHelper.logout(this);//结果回调通知到PoolLogoutListener
}
}
private void login() {
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();
// TODO: 把以上信息发送给游戏服务端做登录校验,需要其他信息请从poolLoginInfo对象中获取
System.out.println("登录成功 userType = " + userType + "; timestamp = " + timestamp + "; serverSign = " + serverSign + "; openId = " + openId);
}
@Override
public void onLoginFailed(String errorMsg) {
System.out.println("登录失败 = " + errorMsg);
}
});
}
private void pay() {
final PoolPayInfo poolPayInfo = new PoolPayInfo();
/********************************************
* 以下所有字段都是必填项
*/
// 设置充值金额,单位“元”
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("operator=xwrw&server_id=39&player_id=2081&cp_order_id=001000100000020811491470345294&dext=2");
// TODO Auto-generated method stub
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);
}
});
}
/**
* 提交角色数据 该接口需要在3个地方调用
*
* 1、登录游戏主场景 2、创建角色 3、角色升级
*/
private void submitRoleData() {
/********************************************
* 以下所有字段都是必填项
*/
PoolRoleInfo poolRoleInfo = new PoolRoleInfo();
poolRoleInfo.setRoleID("123456");
poolRoleInfo.setRoleLevel("10");
poolRoleInfo.setRoleSex("0");
poolRoleInfo.setRoleName("我是角色名");
poolRoleInfo.setServerID("8");
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.setCallType(PoolRoleInfo.Type_EnterGame);
// poolRoleInfo.setCallType(PoolRoleInfo.Type_CreateRole);
// poolRoleInfo.setCallType(PoolRoleInfo.Type_RoleUpgrade);
PoolSdkHelper.submitRoleData(poolRoleInfo, new PoolRoleListener() {
@Override
public void onRoleDataSuccess(String paramCustom) {
System.out.println("提交角色数据成功 = " + paramCustom);
}
});
}
/**
* 用户中心
*
* 游戏方先调用PoolSdkHelper.hasChannelCenter()获取是否有用户中心,
* 如果有的话,游戏中需要添加按钮,点击按钮调用PoolSdkHelper.openChannelCenter();
* 如果没有,则不需要显示按钮,也不用调用下面的接口
*/
private void channelCenter() {
PoolSdkHelper.openChannelCenter();
}
//================================↑↑↑↑↑公共SDK接入代码示例↑↑↑↑↑==================================
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 initLoginView() {
int ya_login_bt = getRedIdByName("ya_login_bt", "id");// getResources().getIdentifier("ya_login_bt",
// "id",
// getPackageName());
yaLoginBt = (Button) findViewById(ya_login_bt);
yaLoginBt.setText("登录");
yaEnterGameBt = (Button) findViewById(getRedIdByName(
"ya_enter_game_bt", "id"));
yaEnterGameBt.setText("进入游戏");
}
private void initGameView() {
yaPayBt = (Button) findViewById(getRedIdByName("ya_pay_bt", "id"));
yaPayBt.setText("支付");
yaSubmitRoleDataBt = (Button) findViewById(getRedIdByName(
"ya_submit_role_data_bt", "id"));
yaSubmitRoleDataBt.setText("提交角色数据");
yaChannelCenter = (Button) findViewById(getRedIdByName(
"ya_channel_center", "id"));
yaChannelCenter.setText("渠道中心");
PoolSdkLog.logError("" + yaPayBt + "yachannel:" + yaChannelCenter);
yaLogoutBt = (Button) findViewById(getRedIdByName("logout_bt", "id"));
yaSwitchAccountBt = (Button) findViewById(getRedIdByName("ya_switch_account_bt", "id"));
yaSwitchAccountBt.setText("切换账号");
yaForumBt = (Button) findViewById(getRedIdByName("forum_bt", "id"));
}
public void yaOnClick(View view) {
if (view == yaLoginBt) {
login();
} else if (view == yaEnterGameBt) {
setContentView(getRedIdByName("public_sdk_self_game", "layout"));// (R.layout.game);
//模拟调用聊天接口:
//PoolSdkHelper.reportChat("content", "世界", "roleId", "roleName", 10, "serverId", "serverName");
initGameView();
} else if (view == yaPayBt) {
pay();
} else if (view == yaSubmitRoleDataBt) {
submitRoleData();
} else if (view == yaChannelCenter) {
channelCenter();
} else if (view == yaLogoutBt){
logout();
} else if (view == yaForumBt){
openForum();
} else if(view == yaSwitchAccountBt){//切换账号
switchAccount();
}
}
}
```
\ No newline at end of file
# 公共SDK服务端接入文档
### 1.登录验证
客户端发送请求参数给服务端,服务端对参数进行 MD5 加密,如果加密结果和serverSign 一致,则验证通过,否则不通过
参数 | 类型 | 描述
------------ | ------------- | ------------
userType | int | 用户类型 ID(渠道类型,兼容以 前帐号体系)
openId | string | 平台渠道方返回用户ID
timestamp | string | 时间戳,公共SDK发送到客户端的参数timestamp, 服务端可以判断 timestamp 是否 在有效的登录时间内
serverSign | string | 验证密钥,公共 SDK 发送到 客户端的参数 serverSign,加密串:gameAppkey=%s&userType=% s&openId=%s&timestamp=%s注意:(改为游戏本身的gameAppkey值)
验证方式:
serverSign=MD5(gameAppkey=%s&userType=%s&openId=%s&timestamp=%s) 如:
md5("gameAppkey=xxxx&userType=1&openId=123&timestamp=111111111111")
gameAppkey : 在公共SDK后台的 Md5加密的KEY
`注意!CP必须要以userType+openId保证帐号唯一性`
### 2. 充值验证(通知游戏方发货)
公共SDK服务器接收到渠道服务器充值回调,对回调进行 MD5 验证,如果验证通过, 则采用Post方式马上回调给游戏充值服务器,否则不会回调充值服务器,然后再返回 信息给渠道服务器。回调参数如下:
参数 | 类型 | 描述
------------ | -------------| ------------
serverId | int | 服务器 ID
playerId | int | 角色 ID
orderId | string | 渠道方订单 ID
payAmount | double | 充值金额(如有商品 ID,此值为商 品的金额, 单位元)
currency | string | 充值货币(CNY:人民币)
goodsId | string | 商品ID,参数对一些有商品列表 的充值有效
goodsName | string | 商品名称
remoteIp | string | 客户端充值 IP
custom | string | 透传参数 ,长度 512
serverSign | string | 发给充值服务器验证的注意:(改为游戏本身的 gameAppkey 值)
uId | string | 平台渠道帐号 ID
gameSimpleName | string | 平台SDK后台游戏代号名
sdkSimpleName | string | 平台SDK代号
queryId | string | 平台SDK订单号
postTime | string | 订单创建时间戳
sign | string | 升级Md5加密的值
验证方式:
旧:serverSign=MD5(serverId=%s&playerId=%s&orderId=%s&gameAppKey=%s)
升级:sign=Md5('serverId=%s&playerId=%s&orderId=%s&payAmount=%s&goodsId=%s&sdkSimpleName=%s&gameAppKey=%s')
%s:为相应的值
gameAppkey : 在公共SDK后台的Md5加密的KEY
验证通过后,返回公共 SDK 服务器数据,数据格式:{"code":0,"message":"无订 单"}。code:0 表示失败,1 表示成功,message:描述原因。
`注意!CP必须要以orderId+sdkSimpleName保证订单唯一性,建议使用sign验证`
### 3. 充值服务器IP地址
182.254.136.76
115.159.41.44
115.159.109.183
118.89.113.235
118.89.196.17
\ No newline at end of file
## 1.魅族 ##
### 调试登录时,提示“游戏不存在”或“游戏签名不正确” ###
SDK 服务端会对参数作必要的校验,校验不通过则有此提示
1、联系运营检查该游戏是否打开了联调状态
2、联系运营检查是否创建了该游戏
3、上架后的游戏需要从游戏中心下载 APK 包进行安装
## 2.搜狗 ##
### 参数QQ_APPID要自行到QQ开放平台申请手Q ID ###
签名必须跟应用宝YSDK一致
## 3.华为 ##
### 需要母包删除 libs 中的 YouaiSDK.jar 再打包 ###
## 4.三星 ##
### 参数 waresid 为商品ID,需去三星后台设置为应用传入价格 ###
## 5.联想 ##
### waresid请到联想后台申请商品编码(使用开放价格模式) ###
## 6.UC ##
### 提交角色信息接口 ###
PoolSdkHelper.submitRoleData接口中的角色创建时间和角色等级变化时间需传正确的值,否则不过审
poolRoleInfo.setRoleChangeTime();//角色等级变化时间
poolRoleInfo.setRoleCTime();//角色创建时间
## 7.酷派 ##
### platPublicKey平台公钥默认值 ###
```
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLx50R+CpH6VD/EfavOTpHOydfAQVjvm/h/SGG/RbM/03ZDfk8JrgezyFwqX06pjKevHZz66Umoq1/3Z9oqhBlJezsM03q2woKbReGSKAPQSkuJg2FY6DdZ1v1gMuCRtF6WOHV7n2TbUvRhZugMpx8PJEV+r6Qf1L41Gt8w6FN8wIDAQAB
```
如渠道有提供以提供为准,没有填默认值
## 8.应用宝YSDK ##
### 请保留好在应用宝后台申请时使用的签名文件,打包时需使用一致的 ###
## 9.OPPO ##
### publicKey应用公钥 ###
```
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmreYIkPwVovKR8rLHWlFVw7YDfm9uQOJKL89Smt6ypXGVdrAKKl0wNYc3/jecAoPi2ylChfa2iRu5gunJyNmpWZzlCNRIau55fxGW0XEu553IiprOZcaw5OuYGlf60ga8QT6qToP0/dpiL/ZbmNUO9kUhosIjEu22uFgR+5cYyQIDAQAB
```
如渠道有提供以提供为准,没有填默认值
## 10.HTC ##
### joloPrivateKey私钥 ###
- "HTC秘钥生成工具与文档"
[https://pan.baidu.com/s/1dE7FSm1](https://pan.baidu.com/s/1dE7FSm1 "HTC秘钥生成工具与文档")
强烈建议找渠道技术帮忙生成
## 11.卓易 ##
### 1.注册账号时输入的账号密码文字颜色和输入框底色相同 ###
<Application>的theme改成android:theme="@android:style/Theme.Black.NoTitleBar"
或者把Activity的theme改成android:theme="@android:style/Theme.Black.NoTitleBar"
### 2.集成到游戏后,发现卓易悬浮图标点击没反应 ###
如果是Unity3D的游戏的话,由于Unity3D和Android之间的事件冲突,导致Android事件得不到响应。
解决办法是,需要将游戏的主Activity(游戏入口)默认继承的NativeActivity或UnityPlayerNativeActivity改为继承Activity,把UnityPlayerNativeActivity里面的方法(如下图所示)拷贝到主Activity。
现在最新Unity3D版本游戏入口也是默认继承Activity。
![](http://i.imgur.com/SlVKWAp.png)
## 12.打包 ##
参数提前确定准备好,尤其是icon,闪图那些
填写某渠道参数时,请牢记到对应渠道后台填写充值回调地址
## 13.多玩YY ##
### 支付时显示支付未成功,appid不存在 ###
因为签名不正确,在游戏提交后联运管理台后,会重新打包签名。(如不了解请与渠道联系)
## 14.360 ##
### 支付时显示Mobile pay signature invalid ###
后台填写的 QHOPENSDK_PRIVATEKEY 参数错误导致,注意此处 private_key,不是app_secret,其生成算法为 app_secret +”#”+ app_key 的加密MD5值,结果为32位全小写(http://pmd5.com/ 在线计算MD5)
![](https://i.imgur.com/JrsLmBZ.png)
如图,替换自己的 app_secret 和 app_key 即可
\ No newline at end of file
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type