NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/HotUpdate/Device/DeviceIdHandle.cs

200 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 int platform;
public DeviceIdInfo()
{
adjust_adid = "";
oaid = DeviceIdHandle.Instance.Oaid;
imei = DeviceIdHandle.Instance.Imei;
caid = "";
idfa = Instance.IDFA;
idfv = Instance.IDFV;
android_id = DeviceIdHandle.Instance.AndroidID;
channel = "";
package_name = Application.identifier;
#if UNITY_IOS && !UNITY_EDITOR
platform = 1;
#else
platform = 0;
#endif
}
}
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;
/// <summary>
/// iOS 获取用户标识
/// </summary>
public string IDFA;
/// <summary>
/// iOS 获取厂商标识
/// </summary>
public string IDFV;
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;
}
}
/// <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;
}
}
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<AndroidJavaObject>("currentActivity");
var appContext = activity.Call<AndroidJavaObject>("getApplicationContext");
var helperClass = new AndroidJavaClass("com.example.oaidtest2.DemoHelper");
var helper = helperClass.CallStatic<AndroidJavaObject>("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<AndroidJavaObject>("currentActivity");
if (activity == null) return;
bridgeClass.CallStatic("init", activity, true);
}
catch (Exception e)
{
Debug.LogError("BYTEDANCE SDK init Error! " + e);
}
#endif
}
}