// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN package com.unity3d.player; 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.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.Window; import com.bjsk.sdk.m.BJSKMsdk; import com.bjsk.sdk.m.BJSKMsdkCallback; import com.bytedance.applog.AppLog; import com.bytedance.applog.GameReportHelper; import com.google.gson.Gson; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import static com.bun.miitmdid.core.JLibrary.context; public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents { protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code private static String ucaller; private static String uFuncName; private static String actionNames; private String TAG = "UnityPlayerActivity"; public static UnityPlayerActivity instance = null; //单例类 // Override this in your custom UnityPlayerActivity to tweak the command line arguments passed to the Unity Android Player // The command line arguments are passed as a string, separated by spaces // UnityPlayerActivity calls this from 'onCreate' // Supported: -force-gles20, -force-gles30, -force-gles31, -force-gles31aep, -force-gles32, -force-gles, -force-vulkan // See https://docs.unity3d.com/Manual/CommandLineArguments.html // @param cmdLine the current command line arguments, may be null // @return the modified command line string or null protected String updateUnityCommandLineArguments(String cmdLine) { return cmdLine; } // Setup activity layout @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity")); getIntent().putExtra("unity", cmdLine); instance = this; mUnityPlayer = new UnityPlayer(this, this); setContentView(mUnityPlayer); mUnityPlayer.requestFocus(); } //利用Toast public int unityCall(final String actionName, final String arg1, final String arg2) { Log.e("unityCall", "unityCall" + actionName + "--arg1--" + arg1); actionNames = actionName; switch (actionName) { case "changeAccount": break; case "enterShareAndFeed": // SJSDKUnityBridge.getInstance().share(actionName,arg3); break; case "getGameFriends": // SJSDKUnityBridge.getInstance().s break; case "getUserInfo": // SJSDKUnityBridge.getInstance().deviceInfo(actionName,arg3); break; case "initSdk": // SJSDKPlugin.getInstance().initSDK(actionName,instance); BJSKMsdk.getInstance().doInit(instance, ConstantsUtils.KtBuyAppKey, new BJSKMsdkCallback() { @Override public void onInitSuccess() { // showToast("初始化成功,游戏中不需要此提示"); Log.e(TAG, "onInitSuccess_arg0"); // BJSKMsdk.getInstance().userLogin(instance); LoginData loginData = new LoginData(); loginData.setAction(actionNames); loginData.setData("ok"); //1、使用JSONObject Gson gson = new Gson(); String str = gson.toJson(loginData); SendUnity(str); } @Override public void onInitFail(String message) { // 不需要提示失败的原因,CP自行处理失败逻辑,如重新进入游戏等 // showToast("初始化失败,提示玩家退出重新进入");、 Log.e(TAG, "onInitFail_arg0" + message); LoginData loginData = new LoginData(); loginData.setAction(actionNames); loginData.setData(message); //1、使用JSONObject Gson gson = new Gson(); String str = gson.toJson(loginData); SendUnity(str); } @Override public void onLoginSuccess(Bundle bundle) { // 注意:客户端登录成功后,只能获取到token,其他用户信息如uid等需要去我方服务器进行token验证后获取 // 获取token格式如下 String token = bundle.getString("token"); // checkBandle(bundle); new Thread(new Runnable() { @Override public void run() { loginVerty(instance, token); } }).start(); } @Override public void onLoginFail(String message) { Log.e(TAG, "hongwu fail login =---" + message); LoginData loginData = new LoginData(); loginData.setAction(actionNames); loginData.setData(message); Gson gson = new Gson(); String str = gson.toJson(loginData); SendUnity(str); } @Override public void onUserSwitchSuccess(Bundle bundle) { } @Override public void onUserSwitchFail(String message) { Log.e(TAG, "onUserSwitchFail"); } @Override public void onPaySuccess(Bundle bundle) { // 请CP以服务端的信息为准 Log.e(TAG, "onPaySuccess"); } @Override public void onPayFail(String message) { } @Override public void onExitGameSuccess() { // 退出游戏,CP需要进行游戏退出的操作 System.exit(1); } @Override public void onExitGameFail() { // 暂不需要操作 // showToast("用户取消退出"); } @Override public void onLogoutSuccess() { // 1.SDK用户退出,回到游戏登录界面 //2.再次调用登录接口userLogin // showGameLoginView(); Log.e(TAG, "LogoutonSuccess"); } @Override public void onLogoutFail(String message) { // 暂不需要操作 Log.e(TAG, "LogoutonFailed"); // SJSDK.getInstance().onLogout(SJCode.CODE_LOGOUT_FAIL); } }); break; case "killGame": // SJSDKUnityBridge.getInstance().exit(actionName,arg3); break; case "login": // SJSDKUnityBridge.getInstance().login(actionName,arg3); BJSKMsdk.getInstance().userLogin(instance); break; case "logout": // SJSDKUnityBridge.getInstance().logout(actionName,arg3); BJSKMsdk.getInstance().doExitGame(instance); // extDilog(); break; case "recharge": // SJSDKUnityBridge.getInstance().pay(actionName,arg3); break; case "sendMessageToPlatform": break; case "showUserAuthentication": break; case "setCallBackClazz": ucaller = arg1; uFuncName = arg2; break; } return 0; } private void extDilog() { instance.runOnUiThread(new Runnable() { @Override public void run() { new AlertDialog.Builder(instance) .setTitle("确认退出游戏?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 回收sdk资源(必须先destroySDK再finish游戏) instance.finish(); System.exit(0); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); } }); } private void checkBandle(Bundle bundle) { boolean isAuth = bundle.getBoolean("isAuth"); int authAge = bundle.getInt("authAge"); JSONObject json = new JSONObject(); Set keys = bundle.keySet(); for (String key : keys) { try { // json.put(key, bundle.get(key)); see edit below json.put(key, JSONObject.wrap(bundle.get(key))); } catch (JSONException e) { //Handle exception here } } LoginData loginData = new LoginData(); loginData.setAction("login"); loginData.setData(json); Log.e(TAG, "onLoginSuccess" + loginData.toString()); } private void loginVerty(Activity activity, String token) { String gid = BJSKMsdk.getInstance().getGid(activity); String pid = BJSKMsdk.getInstance().getPid(activity); Map params = new HashMap(); params.put("pid", pid + ""); params.put("gid", gid + ""); params.put("access_token", token + ""); String timestamp = System.currentTimeMillis() / 1000 + ""; params.put("tm", timestamp); String signStr = getSignData(params); String sign = MD5Util.md5(signStr + "&" + ConstantsUtils.KtBuyAppKey); params.put("sign", sign); Log.e("result", "params" + params.toString()); String result = UnityHttpUtils.httpPost(this, "https://api.kt007.com/api/v1/verify/user", params).replace("\"", ""); Log.e("result", "result" + result); Gson gsons = new Gson(); ResultModel ResultModel = gsons.fromJson(result, ResultModel.class); com.unity3d.player.ResultModel.DataBean data = (com.unity3d.player.ResultModel.DataBean) ResultModel.getData(); /** * 上送登录校验结果数据 */ Log.d(TAG, "SJTouTiaoSDK loginSuccess!==data.getOpenid()=" + data.getOpenid()); GameReportHelper.onEventRegister("userNumber",true); AppLog.setUserUniqueID(data.getOpenid()); LoginData loginData = new LoginData(); loginData.setAction(actionNames); loginData.setData(ResultModel); Gson gson = new Gson(); String str = gson.toJson(loginData); SendUnity(str); } private String getSignData(Map params) { StringBuffer content = new StringBuffer(); List keys = new ArrayList(params.keySet()); // 按照自然升序处理 Collections.sort(keys); for (int i = 0; i < keys.size(); i++) { String key = (String) keys.get(i); // sign参数不参与签名数据 if ("sign".equals(key)) { continue; } String value = (String) params.get(key); if (value != null && !value.isEmpty() && !value.equals("0")) { content.append((i == 0 ? "" : "&") + key + "=" + value); } else { continue; // content.append((i == 0 ? "" : "&") + key + "="); } } String signData = content.toString(); if (signData.startsWith("&")) { signData = signData.substring(1); } return signData.trim(); } public static void SendUnity(String arg, boolean keepAlive) { UnityPlayer.UnitySendMessage(ucaller, uFuncName, arg + "keepAlive=" + keepAlive); } public static void SendUnity(String arg) { Log.e("sdfs", "SendUnity--" + arg); UnityPlayer.UnitySendMessage(ucaller, uFuncName, arg); } // When Unity player unloaded move task to background @Override public void onUnityPlayerUnloaded() { moveTaskToBack(true); } // Callback before Unity player process is killed @Override public void onUnityPlayerQuitted() { } @Override protected void onNewIntent(Intent intent) { // To support deep linking, we need to make sure that the client can get access to // the last sent intent. The clients access this through a JNI api that allows them // to get the intent set on launch. To update that after launch we have to manually // replace the intent with the one caught here. setIntent(intent); mUnityPlayer.newIntent(intent); } // Quit Unity @Override protected void onDestroy() { mUnityPlayer.destroy(); super.onDestroy(); } // Pause Unity @Override protected void onPause() { super.onPause(); mUnityPlayer.pause(); AppLog.onPause(this); } // Resume Unity @Override protected void onResume() { super.onResume(); mUnityPlayer.resume(); AppLog.onResume(this); } // Low Memory Unity @Override public void onLowMemory() { super.onLowMemory(); mUnityPlayer.lowMemory(); } // Trim Memory Unity @Override public void onTrimMemory(int level) { super.onTrimMemory(level); if (level == TRIM_MEMORY_RUNNING_CRITICAL) { mUnityPlayer.lowMemory(); } } // This ensures the layout will be correct. @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mUnityPlayer.configurationChanged(newConfig); } // Notify Unity of the focus change. @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); mUnityPlayer.windowFocusChanged(hasFocus); } // For some reason the multiple keyevent type is not supported by the ndk. // Force event injection by overriding dispatchKeyEvent(). @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_MULTIPLE) return mUnityPlayer.injectEvent(event); return super.dispatchKeyEvent(event); } // Pass any events not handled by (unfocused) views straight to UnityPlayer @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } /*API12*/ public boolean onGenericMotionEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } }