1. 程式人生 > >U8SDK unity3d接入android渠道原始碼。

U8SDK unity3d接入android渠道原始碼。

接入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
	//
	// }
}

下面附上原始碼下載地址

點選下載原始碼