2025-11-18 19:41:00 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections;
|
2025-11-03 15:37:16 +08:00
|
|
|
|
using System.Collections.Generic;
|
2025-11-17 12:40:48 +08:00
|
|
|
|
using System.Runtime.ConstrainedExecution;
|
2025-11-03 15:37:16 +08:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
2025-11-17 13:04:57 +08:00
|
|
|
|
public class DeviceIdHandle
|
2025-11-03 15:37:16 +08:00
|
|
|
|
{
|
2025-11-18 16:43:21 +08:00
|
|
|
|
public class DeviceIdInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
public string adjust_adid;
|
|
|
|
|
|
public string oaid;
|
|
|
|
|
|
public string imei;
|
|
|
|
|
|
public string caid;
|
|
|
|
|
|
public string idfa;
|
|
|
|
|
|
public string idfv;
|
2025-11-26 12:16:57 +08:00
|
|
|
|
public string android_id;
|
2025-11-18 16:43:21 +08:00
|
|
|
|
public string channel;
|
2026-03-19 12:18:58 +08:00
|
|
|
|
public string package_name;
|
2025-11-18 16:43:21 +08:00
|
|
|
|
|
|
|
|
|
|
public DeviceIdInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
adjust_adid = "";
|
|
|
|
|
|
oaid = DeviceIdHandle.Instance.Oaid;
|
|
|
|
|
|
imei = DeviceIdHandle.Instance.Imei;
|
|
|
|
|
|
caid = "";
|
|
|
|
|
|
idfa = "";
|
|
|
|
|
|
idfv = "";
|
2025-11-26 12:16:57 +08:00
|
|
|
|
android_id = DeviceIdHandle.Instance.AndroidID;
|
2025-11-18 16:43:21 +08:00
|
|
|
|
channel = "";
|
2026-03-19 12:18:58 +08:00
|
|
|
|
package_name = Application.identifier;
|
2025-11-18 16:43:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-11-03 15:37:16 +08:00
|
|
|
|
private static DeviceIdHandle _instance;
|
|
|
|
|
|
|
2025-11-17 12:40:48 +08:00
|
|
|
|
private string oaid = "";
|
|
|
|
|
|
private string imei = "";
|
2025-11-26 12:09:05 +08:00
|
|
|
|
private string androidID = "";
|
2025-11-17 12:40:48 +08:00
|
|
|
|
|
|
|
|
|
|
public string Oaid => oaid;
|
|
|
|
|
|
public string Imei => imei;
|
2025-11-26 12:09:05 +08:00
|
|
|
|
public string AndroidID => androidID;
|
2025-11-17 12:40:48 +08:00
|
|
|
|
|
2025-11-14 20:03:39 +08:00
|
|
|
|
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)");
|
2025-11-17 12:40:48 +08:00
|
|
|
|
DeviceIdHandle.Instance.oaid = oaid;
|
2025-11-14 20:03:39 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogError($"OAID 获取失败: {msg}");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-17 12:40:48 +08:00
|
|
|
|
class IMEICallbackProxy : AndroidJavaProxy
|
|
|
|
|
|
{
|
|
|
|
|
|
public IMEICallbackProxy() : base("com.example.oaidtest2.DemoHelper$ImeiCallback") { }
|
|
|
|
|
|
void onResult(string imei)
|
|
|
|
|
|
{
|
|
|
|
|
|
DeviceIdHandle.Instance.imei = imei;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-26 12:09:05 +08:00
|
|
|
|
class AndroidIDCallbackProxy : AndroidJavaProxy
|
|
|
|
|
|
{
|
|
|
|
|
|
public AndroidIDCallbackProxy() : base("com.example.oaidtest2.DemoHelper$AndroidIdCallback") { }
|
|
|
|
|
|
void onResult(string androidID)
|
|
|
|
|
|
{
|
|
|
|
|
|
DeviceIdHandle.Instance.androidID = androidID;
|
|
|
|
|
|
Debug.Log($"Android ID: {androidID}");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-03 15:37:16 +08:00
|
|
|
|
public static DeviceIdHandle Instance
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_instance is null)
|
|
|
|
|
|
{
|
2025-11-17 13:04:57 +08:00
|
|
|
|
_instance = new DeviceIdHandle();
|
2025-11-03 15:37:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return _instance;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-11 14:21:58 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 判断当前渠道是否不需要通过 DeviceHelper 获取设备 ID
|
|
|
|
|
|
/// Dev / QA_Dev 渠道服务端不消费 oaid/imei/android_id,且包内未集成 DeviceHelper AAR,跳过调用
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-26 18:14:59 +08:00
|
|
|
|
public AndroidJavaClass bridgeClass;
|
|
|
|
|
|
|
2025-11-17 12:40:48 +08:00
|
|
|
|
public void Initialize()
|
2025-11-12 19:29:37 +08:00
|
|
|
|
{
|
|
|
|
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
2026-03-11 14:21:58 +08:00
|
|
|
|
// Dev / QA_Dev 渠道不集成 DeviceHelper AAR,且服务端不消费相关字段,跳过调用
|
|
|
|
|
|
if (IsDeviceHelperSkippedChannel())
|
2025-11-12 19:29:37 +08:00
|
|
|
|
{
|
2026-03-11 14:21:58 +08:00
|
|
|
|
Debug.Log("[DeviceIdHandle] 当前渠道不需要 DeviceHelper,跳过 OAID/IMEI/AndroidID 获取。");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
//获取当前 Android Activity 并调用插件初始化接口
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
|
|
|
|
|
|
var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
|
|
|
|
|
|
var appContext = activity.Call<AndroidJavaObject>("getApplicationContext");
|
2025-11-17 12:40:48 +08:00
|
|
|
|
|
2026-03-11 14:21:58 +08:00
|
|
|
|
var helperClass = new AndroidJavaClass("com.example.oaidtest2.DemoHelper");
|
|
|
|
|
|
var helper = helperClass.CallStatic<AndroidJavaObject>("getInstance", appContext);
|
2025-11-12 19:29:37 +08:00
|
|
|
|
|
2026-03-11 14:21:58 +08:00
|
|
|
|
helper.Call("getOAID", new OaidCallbackProxy());
|
2025-11-12 19:29:37 +08:00
|
|
|
|
|
2026-03-11 14:21:58 +08:00
|
|
|
|
// 调用 Android 的 GetIMEI 方法
|
|
|
|
|
|
helper.Call("getImei", new IMEICallbackProxy());
|
2025-11-26 12:09:05 +08:00
|
|
|
|
|
2026-03-11 14:21:58 +08:00
|
|
|
|
// 调用 Android 的 GetAndroidID 方法
|
|
|
|
|
|
helper.Call("getAndroidId", new AndroidIDCallbackProxy());
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (System.Exception e)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogError("GetDeviceId failed: " + e);
|
|
|
|
|
|
}
|
2025-11-12 19:29:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
#else
|
2025-11-17 12:40:48 +08:00
|
|
|
|
Debug.Log("GetDeviceID: Initialized (editor or non-Android). Android call skipped.");
|
2025-11-12 19:29:37 +08:00
|
|
|
|
#endif
|
2025-11-18 19:41:00 +08:00
|
|
|
|
|
|
|
|
|
|
#if SDK_BYTEDANCE
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2026-03-26 18:14:59 +08:00
|
|
|
|
bridgeClass = new AndroidJavaClass("com.bytedance.convertunitybridge.ConvertUnityBridge");
|
2025-11-18 19:41:00 +08:00
|
|
|
|
|
|
|
|
|
|
var up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
|
|
|
|
|
|
var activity = up.GetStatic<AndroidJavaObject>("currentActivity");
|
|
|
|
|
|
if (activity == null) return;
|
|
|
|
|
|
|
|
|
|
|
|
bridgeClass.CallStatic("init", activity, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogError("BYTEDANCE SDK init Error! " + e);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
2025-11-03 15:37:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|