using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; using UnityEngine; namespace EFSDK { /// /// TKG Native SDK Android platform interface call /// public class EFSdk { private static EFSdk _mEfSdk; // 保持变量名不变 private static string mappingInfo = ""; public static EFSdk get() { if (_mEfSdk == null) { _mEfSdk = new EFSdk(); } return _mEfSdk; } private AndroidJavaObject jo; public EFSdk() { Debug.Log($"GetNewSDKClass():{GetNewSDKClass()}"); Debug.Log($"initSDK():{GenerateAndroidName("initSDK")}"); // java interface class using (AndroidJavaClass jc = new AndroidJavaClass(GetNewSDKClass())) { jo = jc.GetStatic("INSTANCE"); } } private static string oriSDKPName = "com.earn.push"; private static string oriSDK = "_SDK"; private static string GetNewSDKClass() { return GetSDKPackage() + GenerateAndroidName(oriSDK); } private static string GetSDKPackage() { string[] parts = oriSDKPName.Split('.'); string[] parts2 = new string[parts.Length]; for (int i = 0; i < parts.Length; i++) { parts2[i] = GenerateAndroidName(parts[i]); } string newPName = ""; for (int i = 0; i < parts2.Length; i++) { newPName += parts2[i] + "."; } return newPName; } private static string GenerateAndroidName(string oriString) { string md5Str = GetFirstEightWithUnderscore(GetMD5Hash(Application.identifier + oriString)); return md5Str; } public static string GetMD5Hash(string input) { using (var md5 = MD5.Create()) { var inputBytes = Encoding.ASCII.GetBytes(input); var hashBytes = md5.ComputeHash(inputBytes); var builder = new StringBuilder(); foreach (var t in hashBytes) { builder.Append(t.ToString("x2")); // Convert byte to hexadecimal string } return builder.ToString(); } } static string GetFirstEightWithUnderscore(string str) { if (string.IsNullOrEmpty(str)) return str; string sub = str.Length <= 8 ? str : str.Substring(0, 8); if (char.IsDigit(sub[0])) { sub = "a" + sub; } return sub; } private T SDKCall(string _method, params object[] _param) { try { string newMethod = GenerateAndroidName(_method); Debug.Log($"SDKCall newMethod:{newMethod}"); return jo.Call(newMethod, _param); } catch (Exception e) { Debug.LogError(e); } return default(T); } private void SDKCall(string _method, params object[] _param) { try { string newMethod = GenerateAndroidName(_method); Debug.Log($"SDKCall newMethod:{newMethod}"); jo.Call(newMethod, _param); } catch (Exception e) { Debug.LogError(e); } } public enum ActionType { SDK_INIT_Succ, //GAM页面加载成功 H5_Load_Succ, //H5页面加载成功 ON_RESUME, //游戏可见时回调, // CAN_GOBACK, //游戏可见时回调, } public Action ActionCallback; public Action> ActionSDKEventCallback; public Action HdH5ImpressionAction; public Action mCanGobackAction; public Action mReqNotifyPermissionAction; /// /// 在Init方法之后调用这个方法,设置SDK上报事件回调, 将SDK传过来的事件上报到Firebase,数数等 /// /// /// 事件ID,事件属性 /// public void SetSDKEventCallback(Action> eventKeyDict) { ActionSDKEventCallback = eventKeyDict; } /// /// 互动广告展示回调,此时可以计算上报互动广告展示次数和收益 /// /// string 是互动广告的url public void SetHdH5ImpressionCallback(Action callback) { HdH5ImpressionAction = callback; } /// /// 初始化 /// /// ActionType 回调类型 ; string msg public void Init(Action actionCallbvack) { ActionCallback = actionCallbvack; SDKInit(); } private void SDKInit() { SDKCall("initSDK", mappingInfo); ActionCallback?.Invoke(ActionType.SDK_INIT_Succ, string.Empty); } /// /// 当游戏进程启动之后,可以接收响应的时候(一般在游戏内事件上报相关内容初始化完毕调用即可,参数传true),调用这个方法通知SDK, /// SDK收到通知后会开始将SDK侧的事件回传给游戏,作事件上报 /// /// 传 true public void SetGameActive(bool active) { SDKCall("onGameActive", active); } /// /// 展示WebView /// /// 标签id /// 网址 /// /// public void ShowWebView(int id, string url, RectTransform pRect, Camera pCam = null) { Vector3[] tWorldCorners = new Vector3[4]; pRect.GetWorldCorners(tWorldCorners); Vector2 tTopLeft = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[1]); Vector2 tBottomRight = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[3]); int tWidth = (int)Mathf.Abs(tBottomRight.x - tTopLeft.x); int tHeight = (int)Mathf.Abs(tBottomRight.y - tTopLeft.y); SDKCall("showWebViewToActivity", id, url, (int)tTopLeft.x, (int)(Screen.height - tTopLeft.y), tWidth, tHeight); } /// /// 移除所有原生View, 回到游戏时调用 /// /// public void RemoveAll() { SDKCall("removeAll"); } /// /// 刷新当前页面 /// /// public void Refresh() { SDKCall("refresh"); } /// /// 回上一页 /// /// public void GoBack() { SDKCall("goBack"); } /// /// 回首页 /// /// public void GoHome() { SDKCall("goHome"); } /// /// /// /// public void ShowToast(string message) { SDKCall("showToast", message); } /// /// 判断当前网页是否还能返回上一页, true:可以返回,此时页面不在首页 false: 不能返回了,当前页面就在首页 /// public void CanGoback(Action canGobackAction) { mCanGobackAction = canGobackAction; SDKCall("canGoback"); } #region 推送通知 /// /// 启用v2版本常驻通知样式 /// /// rue:启用v2版本常驻通知样式,false:禁用 (禁用将使用V1版本常驻通知样式) public void EnablePersistentStyleV2(bool enable) { SDKCall("enablePersistentStyleV2", enable); } /// /// 设置v2版本常驻通知的文案 /// /// 图标 1 文案 /// 图标 2 文案 /// 图标 3 文案 /// 图标 4 文案 public void SetPersistentStyleV2Text(string text1, string text2, string text3, string text4) { SDKCall("setPersistentStyleV2Text", text1, text2, text3, text4); } /// /// 满足条件:未领取 R$0.1 的 买量用户, 调用这个方法 /// public void SubscribeUnclaimed01() { SDKCall("subscribeUnclaimed01"); } /// /// 不满足条件:未领取 R$0.1 的 买量用户, 调用这个方法 /// public void UnSubscribeUnclaimed01() { SDKCall("unSubscribeUnclaimed01"); } /// // 满足条件: 在排队中 且 当日R$1 未领取 的买量用户, 调用这个方法 /// public void SubscribePending1() { SDKCall("subscribePending1"); } /// /// 不满足条件: 在排队中 且 当日R$1 未领取 的买量用户, 调用这个方法 /// public void UnSubscribePending1() { SDKCall("unSubscribePending1"); } /// /// 订阅Firebase推送主题 /// /// 主题名称 public void SubscribeToTopic(string topic) { SDKCall("subscribeToTopic", topic); } /// /// 取消订阅Firebase推送主题 /// /// 主题名称 public void UnSubscribeToTopic(string topic) { SDKCall("UnSubscribeToTopic", topic); } /// /// 向SDK上报当前金币总数,每次金币变化都要调用一次 /// /// public void SendTotalGold2SDK(int totalGold) { SDKCall("setGoldNum", totalGold.ToString()); } /// /// 向SDK上报当前要提现的现金额,每次变化都要调用一次 /// /// public void SendCashNum2SDK(double cashNum) { SDKCall("setCashNum", cashNum.ToString("0.00")); } /// /// 向SDK上报 游戏名字(当前语言的),每次语言变化都上报 /// /// public void SetGameName(string gameName) { SDKCall("setGameName", gameName); } /// /// 设置当前游戏语言是否是 西班牙语 /// /// /// 西班牙语传 true, 其他的都传 false public void SetCurrLang(bool isEs) { SDKCall("setCurrLang", isEs); } /// /// 获取当前是否有通知权限 /// public bool HasNotifyPermission() { return SDKCall("hasNotifyPermission"); } /// /// 请求获取通知权限 /// public void ReqNotifyPermission() { SDKCall("reqNotifyPermission"); } /// /// 请求获取通知权限 /// 授权弹窗关闭回调 bool:表示用户是否允许了权限 true:有权限 false:无权限 /// public void ReqNotifyPermission(Action action) { mReqNotifyPermissionAction = action; SDKCall("reqNotifyPermission"); } /// /// 设置推送开关, SDK默认关闭通知 /// /// public void SetPushSwitch(bool isOpen) { SDKCall("pushSwitch", isOpen); } /// /// 消息类通知弹出间隔设置为60秒(在线参数控制)-Key: messagenotif Value:60 /// /// public void SetPushMessagenotif(int timeSeconds) { SDKCall("setPushMessagenotif", timeSeconds); } /// /// 持续性通知在进入游戏时弹出的时间间隔设置为300秒(在线参数控制 )-Key:persistentnotif Value:300 /// /// public void SetPushPersistentnotif(int timeSeconds) { SDKCall("setPushPersistentnotif", timeSeconds); } /// /// 每次回调游戏的onResume的时候都调用一次,获取游戏要跳转的页面 /// /// /// 0 不需要进行任何跳转 /// 1 进行游戏主页 /// 2 进入游戏的金币提现界面 /// 3 进入对应小游戏1界面 /// 4 进入对应小游戏2界面 /// public int GetJumpPage() { return SDKCall("getJumpPage"); } #endregion #region 小组件 public enum WidgetType { Widget3X2 = 1, Widget5X1 = 2, } /// /// 获取指定类型的小组件是否已添加到桌面 /// /// /// public bool IsWidgetAdded(WidgetType type) { return SDKCall("isWidgetAdded", (int)type); } public Action actionRequestAddWidgetResult = null; /// /// 将指定类型的小组件添加到桌面(小组件采用默认样式) /// /// /// 小组件添加结果回调 /// public void RequestAddWidget(WidgetType type, Action action) { actionRequestAddWidgetResult = action; SDKCall("requestAddWidget", (int)type); } /// /// 请求将Widget3X2添加到桌面,并自定义文案 /// /// 标题1文案 /// 标题2文案 /// 进度条上的文案 /// 按钮的文案 /// 小组件添加结果回调 public void RequestAddWidget3x2(string title1, string title2, string progressStr, string buttonStr, Action action) { actionRequestAddWidgetResult = action; SDKCall("requestAddWidget3x2", title1, title2, progressStr, buttonStr); } /// /// 请求将 Widget5X1 添加到桌面,并自定义文案 /// /// 内容文案 /// 小组件添加结果回调 /// 文案文字十六进制颜色值,如: #FFFFFF public void RequestAddWidget5x1(string content, Action action, string contentTextColor = "#FFFFFF") { actionRequestAddWidgetResult = action; SDKCall("requestAddWidget5x1", content, contentTextColor); } #endregion } }