U8SDK unity3d接入android渠道原始碼。
阿新 • • 發佈:2018-11-08
接入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 // // } }
下面附上原始碼下載地址