using System; using System.Collections; using System.Collections.Generic; using System.Runtime.ConstrainedExecution; using UnityEngine; public class DeviceIdHandle { public class DeviceIdInfo { public string adjust_adid; public string oaid; public string imei; public string caid; public string idfa; public string idfv; public string android_id; public string channel; public string package_name; public DeviceIdInfo() { adjust_adid = ""; oaid = DeviceIdHandle.Instance.Oaid; imei = DeviceIdHandle.Instance.Imei; caid = ""; idfa = ""; idfv = ""; android_id = DeviceIdHandle.Instance.AndroidID; channel = ""; package_name = Application.identifier; } } private static DeviceIdHandle _instance; private string oaid = ""; private string imei = ""; private string androidID = ""; public string Oaid => oaid; public string Imei => imei; public string AndroidID => androidID; class OaidCallbackProxy : AndroidJavaProxy { public OaidCallbackProxy() : base("com.example.oaidtest2.DemoHelper$OaidCallback") { } void onResult(int code, string msg, string oaid, long durationMs) { if (code == 0) { Debug.Log($"OAID: {oaid} (耗时: {durationMs}ms)"); DeviceIdHandle.Instance.oaid = oaid; } else { Debug.LogError($"OAID 获取失败: {msg}"); } } } class IMEICallbackProxy : AndroidJavaProxy { public IMEICallbackProxy() : base("com.example.oaidtest2.DemoHelper$ImeiCallback") { } void onResult(string imei) { DeviceIdHandle.Instance.imei = imei; } } class AndroidIDCallbackProxy : AndroidJavaProxy { public AndroidIDCallbackProxy() : base("com.example.oaidtest2.DemoHelper$AndroidIdCallback") { } void onResult(string androidID) { DeviceIdHandle.Instance.androidID = androidID; Debug.Log($"Android ID: {androidID}"); } } public static DeviceIdHandle Instance { get { if (_instance is null) { _instance = new DeviceIdHandle(); } return _instance; } } /// /// 判断当前渠道是否不需要通过 DeviceHelper 获取设备 ID /// Dev / QA_Dev 渠道服务端不消费 oaid/imei/android_id,且包内未集成 DeviceHelper AAR,跳过调用 /// private static bool IsDeviceHelperSkippedChannel() { // 通过反射访问 AOT 的 PackDataInst,避免直接引用 AOT 命名空间导致编译错误 try { var type = System.Type.GetType("PhxhSDK.AOT.VersionUpdate.PackDataInst, PhxhSDK"); if (type == null) return false; var instProp = type.GetProperty("Inst", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); if (instProp == null) return false; var inst = instProp.GetValue(null); if (inst == null) return false; var localInfoProp = inst.GetType().GetProperty("localInfo"); if (localInfoProp == null) return false; var localInfo = localInfoProp.GetValue(inst); if (localInfo == null) return false; var wsProp = localInfo.GetType().GetField("workSpace"); if (wsProp == null) return false; var ws = wsProp.GetValue(localInfo) as string ?? ""; return ws == "Dev" || ws == "QA_Dev"; } catch { return false; } } public AndroidJavaClass bridgeClass; public void Initialize() { #if UNITY_ANDROID && !UNITY_EDITOR // Dev / QA_Dev 渠道不集成 DeviceHelper AAR,且服务端不消费相关字段,跳过调用 if (IsDeviceHelperSkippedChannel()) { Debug.Log("[DeviceIdHandle] 当前渠道不需要 DeviceHelper,跳过 OAID/IMEI/AndroidID 获取。"); } else { //获取当前 Android Activity 并调用插件初始化接口 try { var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); var activity = unityPlayer.GetStatic("currentActivity"); var appContext = activity.Call("getApplicationContext"); var helperClass = new AndroidJavaClass("com.example.oaidtest2.DemoHelper"); var helper = helperClass.CallStatic("getInstance", appContext); helper.Call("getOAID", new OaidCallbackProxy()); // 调用 Android 的 GetIMEI 方法 helper.Call("getImei", new IMEICallbackProxy()); // 调用 Android 的 GetAndroidID 方法 helper.Call("getAndroidId", new AndroidIDCallbackProxy()); } catch (System.Exception e) { Debug.LogError("GetDeviceId failed: " + e); } } #else Debug.Log("GetDeviceID: Initialized (editor or non-Android). Android call skipped."); #endif #if SDK_BYTEDANCE try { bridgeClass = new AndroidJavaClass("com.bytedance.convertunitybridge.ConvertUnityBridge"); var up = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); var activity = up.GetStatic("currentActivity"); if (activity == null) return; bridgeClass.CallStatic("init", activity, true); } catch (Exception e) { Debug.LogError("BYTEDANCE SDK init Error! " + e); } #endif } }