版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lh_qq/article/details/80176371
接入SDK对于游戏发行的小伙伴来说应该都不陌生,有时游戏研发好了要开始上线了。就回去接各大渠道。这可是一个不小的工作量,市面上的游戏分发渠道至少有300+个,主流的也有50+个,一个一个的去接这对游戏来说是一个很庞大的工作量,那市面上有没有批量接入的呢,有当然有俗话说有需求就会有市场嘛,就会有人专门去干这个事。甚至市面上也有专门的公司做这个事。用他们的固然很方便但是这样用会数据就会掌握在别人手上了。相信中兴的事件大家不会陌生,所以我觉得有必要自己开发一套统一接入工具。当然这套东西不是我开发的,我只是会用然后想把它分享给大家。由于种种原因我只能分享一部分代码。现在我就分享unity游戏接入渠道的中间件。
分为两部分
第一是游戏主activity需要继承的context类。
package com.u8.sdk;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Intent;
import android.os.Bundle;
import com.u8.sdk.plugin.U8Pay;
import com.u8.sdk.plugin.U8Share;
import com.u8.sdk.plugin.U8User;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
/***
* 记得将游戏工程中的AndroidManifest.xml中application节点,增加一个android:name="U8Application"
* 如果游戏有自己的Application。那么通过实现IApplicationListener接口来实现,而不要使用继承Application。
* 然后将自己的Application类
* ,配置到AndroidManifest.xml中的meta-data节点中,name为"U8_Game_Application"
*
* @author
*
*/
public class U8UnityContext extends UnityPlayerActivity {
public final static String CALLBACK_GAMEOBJECT_NAME = "(u8sdk_callback)"; // unity中接收回调通知的GameObject的名称
public final static String CALLBACK_INIT = "OnInitSuc"; // SDK初始化成功的回调方法名称和Unity中一致
public final static String CALLBACK_LOGIN = "OnLoginSuc"; // SDK登录成功的回调方法名称和Unity中一致
public final static String CALLBACK_LOGINFAIL = "OnLoginFail"; // SDK登出的回调方法名称和Unity中一致
public final static String CALLBACK_SWITCH_LOGIN = "OnSwitchLogin"; // SDK切换帐号的回调方法名称和Unity中一致
public final static String CALLBACK_SWITCH_LOGIN_SUC = "OnSwitchLoginSuc"; // SDK切换帐号的回调方法名称和Unity中一致,成功切换到新账号
public final static String CALLBACK_LOGOUT = "OnLogout"; // SDK登出的回调方法名称和Unity中一致
public final static String CALLBACK_PAY = "OnPaySuc"; // SDK支付成功回调方法名称和Unity中一致
public final static String CALLBACK_EXIT_GAME = "OnExitGame";
public final static String CALLBACK_BINDEMAIL = "OnBindEmail"; // 邮箱绑定成功的回调方法名称和Unity中一致
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSDK();
}
// U8SDK 初始化
public void initSDK() {
U8SDK.getInstance().setSDKListener(new UnityU8SDKListener(this));
U8SDK.getInstance().init(this);
U8SDK.getInstance().onCreate();
}
public void logEvent(String paramStr) {
U8User.getInstance().logEvent(paramStr);
}
// 登录接口
public void login() {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().login();
}
});
}
// 自定义登录接口
public void loginCustom(final String customData) {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().login(customData);
}
});
}
// 账号注册,用于鹤图或其他需要注册账号的渠道
public void registerCustom(final String customData) {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().registerCustom(customData);
}
});
}
// 绑定邮箱,用于鹤图或其他需要绑定邮箱的渠道
public void bindEmail(final String customData) {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().bindEmail(customData);
}
});
}
public void setAuthResult(final String str) {
try {
JSONObject obj = new JSONObject(str);
U8SDK.getInstance().setSDKUserID(obj.getString("SDKUserID"));
} catch (JSONException e) {
e.printStackTrace();
}
}
// 切换帐号接口
public void switchLogin() {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().switchLogin();
}
});
}
// 显示用户中心接口
public void showAccountCenter() {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().showAccountCenter();
}
});
}
// 登出
public void logout() {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().logout();
}
});
}
// 提交扩展数据
public void submitExtraData(String data) {
final UserExtraData extraData = parseGameData(data);
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().submitExtraData(extraData);
}
});
}
// SDK退出接口
public void exit() {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8User.getInstance().exit();
}
});
}
// 支付接口
public void pay(String data) {
final PayParams params = parsePayParams(data);
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8Pay.getInstance().pay(params);
}
});
}
// 分享接口
public void share(String data) {
final ShareParams shareparams = parseShareParams(data);
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
U8Share.getInstance().share(shareparams);
}
});
}
// SDK是否支持退出确认功能
public boolean isSupportExit() {
return U8User.getInstance().isSupport("exit");
}
// SDK是否支持用户中心
public boolean isSupportAccountCenter() {
return U8User.getInstance().isSupport("showAccountCenter");
}
// SDK是否支持登出
public boolean isSupportLogout() {
return U8User.getInstance().isSupport("logout");
}
// SDK是否支持登出确认
public boolean isSupportLogoutConfirm() {
return U8User.getInstance().isSupport("logoutConfirm");
}
// SDK是否支持分享
public boolean isSupportShare() {
return U8User.getInstance().isSupport("share");
}
// 向Unity中发送消息
public void sendCallback(String name, String jsonParams) {
if (jsonParams == null) {
jsonParams = "";
}
UnityPlayer
.UnitySendMessage(CALLBACK_GAMEOBJECT_NAME, name, jsonParams);
}
private UserExtraData parseGameData(String str) {
UserExtraData data = new UserExtraData();
try {
JSONObject json = new JSONObject(str);
data.setDataType(json.getInt("dataType"));
data.setRoleID(json.getString("roleID"));
data.setRoleName(json.getString("roleName"));
data.setRoleLevel(json.getString("roleLevel"));
data.setServerID(json.getInt("serverID"));
data.setServerName(json.getString("serverName"));
data.setMoneyNum(json.getInt("moneyNum"));
} catch (JSONException e) {
e.printStackTrace();
}
return data;
}
private PayParams parsePayParams(String str) {
PayParams params = new PayParams();
try {
JSONObject json = new JSONObject(str);
params.setProductId(json.getString("productId"));
params.setProductName(json.getString("productName"));
params.setProductDesc(json.getString("productDesc"));
params.setPrice(json.getInt("price"));
params.setRatio(0);// 该字段废弃不用
params.setBuyNum(json.getInt("buyNum"));
params.setCoinNum(json.getInt("coinNum"));
params.setServerId(json.getString("serverId"));
params.setServerName(json.getString("serverName"));
params.setRoleId(json.getString("roleId"));
params.setRoleName(json.getString("roleName"));
params.setRoleLevel(json.getInt("roleLevel"));
params.setVip(json.getString("vip"));
params.setOrderID(json.getString("orderID"));// 需要从x-server获取
params.setExtension(json.getString("extension"));
// 使用xServer 新增字段添加 ctype roleType
params.setCtype(json.getInt("cType")); // 货币类型
params.setRoleType(json.getInt("roleType")); // 角色类型
} catch (Exception e) {
e.printStackTrace();
}
return params;
}
private ShareParams parseShareParams(String str) {
ShareParams params = new ShareParams();
try {
JSONObject json = new JSONObject(str);
params.setTitle(json.getString("title"));
params.setTitleUrl(json.getString("titleUrl"));
params.setSourceName(json.getString("sourceName"));
params.setSourceUrl(json.getString("sourceUrl"));
params.setContent(json.getString("content"));
params.setUrl(json.getString("url"));
params.setImgUrl(json.getString("imgUrl"));
params.setDialogMode(json.getBoolean("dialogMode"));
params.setNotifyIcon(json.getInt("notifyIcon"));
params.setNotifyIconText(json.getString("notifyIconText"));
params.setComment(json.getString("comment"));
} catch (Exception e) {
e.printStackTrace();
}
return params;
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
U8SDK.getInstance().onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
public void onStart() {
U8SDK.getInstance().onStart();
super.onStart();
}
public void onPause() {
U8SDK.getInstance().onPause();
super.onPause();
}
public void onResume() {
U8SDK.getInstance().onResume();
super.onResume();
}
public void onNewIntent(Intent newIntent) {
U8SDK.getInstance().onNewIntent(newIntent);
super.onNewIntent(newIntent);
}
public void onStop() {
U8SDK.getInstance().onStop();
super.onStop();
}
public void onDestroy() {
U8SDK.getInstance().onDestroy();
super.onDestroy();
}
public void onRestart() {
U8SDK.getInstance().onRestart();
super.onRestart();
}
}
第二部分是各个事件的回调接口listener。
package com.u8.sdk;
import java.util.Locale;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
import android.widget.Toast;
import com.u8.sdk.verify.UToken;
public class UnityU8SDKListener implements IU8SDKListener {
private U8UnityContext context;
private boolean isSwitchAccount = false; // 当前是否为切换帐号
public UnityU8SDKListener(U8UnityContext context) {
this.context = context;
}
@Override
public void onResult(final int code, String msg) {
// TODO Auto-generated method stub
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
String curLanguage = Locale.getDefault().getLanguage();
String curCountry = Locale.getDefault().getCountry()
.toLowerCase();
switch (code) {
case U8Code.CODE_INIT_SUCCESS:
context.sendCallback(U8UnityContext.CALLBACK_INIT, null);
break;
case U8Code.CODE_INIT_FAIL:
Toast.makeText(context, "SDK初始化失败", Toast.LENGTH_SHORT)
.show();
break;
case U8Code.CODE_LOGIN_FAIL:
// 这里不需要提示,一般SDK有提示
// Toast.makeText(context, "SDK登录失败",
// Toast.LENGTH_SHORT).show();
context.sendCallback(U8UnityContext.CALLBACK_LOGINFAIL,
null);
break;
case U8Code.CODE_PAY_FAIL:
if ("zh".equals(curLanguage)) {
if ("cn".equals(curCountry)) {
Toast.makeText(context, "支付失败", Toast.LENGTH_SHORT)
.show();
} else if ("tw".equals(curCountry)) {
Toast.makeText(context, "支付失敗", Toast.LENGTH_SHORT)
.show();
}
}
break;
case U8Code.CODE_PAY_SUCCESS:
if ("zh".equals(curLanguage)) {
if ("cn".equals(curCountry)) {
Toast.makeText(context, "支付成功,到账时间可能稍有延迟",
Toast.LENGTH_SHORT).show();
} else if ("tw".equals(curCountry)) {
Toast.makeText(context, "支付成功,到賬時間可能稍有延遲",
Toast.LENGTH_SHORT).show();
}
}
break;
case U8Code.CODE_LOGOUT_SUCCESS:
context.sendCallback(U8UnityContext.CALLBACK_LOGOUT, null);
break;
case U8Code.CODE_EXIT_GAME_CONFIRMATION:
context.sendCallback(U8UnityContext.CALLBACK_EXIT_GAME, "");
break;
}
}
});
}
// 此接口已经废弃
@Override
public void onInitResult(InitResult result) {
// TODO Auto-generated method stub
// 此接口已经废弃
}
// SDK登录成功的回调
@Override
public void onLoginResult(JSONObject data) {
this.isSwitchAccount = false;
// tip("SDK登录成功");
try {
data.put("channel", U8SDK.getInstance().getCurrChannel() + "");
Log.d("U8SDK",
"Login to SDK successfully. Params prepared to send to Unity: "
+ data.toString());
context.sendCallback(U8UnityContext.CALLBACK_LOGIN, data.toString());
} catch (JSONException e) {
Log.e("U8SDK", "Error creating login result json.");
e.printStackTrace();
}
}
// 邮箱绑定成功的回调
@Override
public void onBindEmailResult(JSONObject data) {
this.isSwitchAccount = false;
// tip("邮箱绑定成功");
try {
data.put("channel", U8SDK.getInstance().getCurrChannel() + "");
Log.d("U8SDK",
"Bind Email successfully. Params prepared to send to Unity: "
+ data.toString());
context.sendCallback(U8UnityContext.CALLBACK_BINDEMAIL,
data.toString());
} catch (JSONException e) {
Log.e("U8SDK", "Error creating login result json.");
e.printStackTrace();
}
}
// 切换帐号,需要回到登录界面,并弹出SDK登录界面
@Override
public void onSwitchAccount() {
context.sendCallback(U8UnityContext.CALLBACK_SWITCH_LOGIN, null);
}
// 切换帐号,并登录成功,到这里和Login的回调onLoginResult一样
@Override
public void onSwitchAccount(JSONObject data) {
Log.d("U8SDK", "SDK 切换帐号并登录成功,带 token 等参数回调 Unity");
this.isSwitchAccount = true;
try {
data.put("channel", U8SDK.getInstance().getCurrChannel() + "");
data.put("password", "");
Log.d("U8SDK",
"Login to SDK successfully. Params prepared to send to Unity: "
+ data.toString());
context.sendCallback(U8UnityContext.CALLBACK_SWITCH_LOGIN_SUC,
data.toString());
} catch (JSONException e) {
Log.e("U8SDK", "Error creating login result json.");
e.printStackTrace();
}
}
// 登出,需要回到登录界面,并弹出SDK登录界面
@Override
public void onLogout() {
context.sendCallback(U8UnityContext.CALLBACK_LOGOUT, null);
}
// SDK登录成功之后,去U8Server进行登录认证
@Override
public void onAuthResult(boolean suc, UToken token/*
* int userID, String
* sdkUserID, String token
*/) {
if (suc) {
tip("SDK登录认证失败,确认U8Server是否配置");
return;
}
JSONObject json = new JSONObject();
try {
json.put("isSuc", suc);
json.put("isSwitchAccount", isSwitchAccount);
if (suc) {
// json.put("userID", token.getUserID());
// json.put("sdkUserID", token.getSdkUserID());
// json.put("appID", token.getAppID());
// json.put("channelID", token.getChannelID());
// json.put("extension", token.getExtension());
// json.put("username", auth.getUsername());
// json.put("sdkUsername", authResult.getSdkUsername());
// json.put("token", token);
}
} catch (Exception e) {
e.printStackTrace();
}
context.sendCallback(U8UnityContext.CALLBACK_LOGIN, json.toString());
}
// 对于手机网游,不需要实现这个接口,因为网游支付是通过服务器回调通知加虚拟币的。
// 这个接口主要用于单机游戏,作为单机的支付结果回调接口
@Override
public void onPayResult(PayResult result) {
// TODO
}
// 支付成功的回调
@Override
public void onPayResult(JSONObject result) {
context.sendCallback(U8UnityContext.CALLBACK_PAY, result.toString());
}
private void tip(final String tip) {
U8SDK.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, tip, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onLogEvent(JSONObject jsonObject) {
// TODO Auto-generated method stub
Log.d("unityU8SDKListener", "onLogEvent()...");
}
// @Override
// public void onAuthResult(boolean suc, UToken token) {
// // TODO Auto-generated method stub
//
// }
}
下面附上源码下载地址