如何通过C++获取Oculus Quest系列设备的MAC地址
Oculus Quest 2(Android平台)MAC地址获取解决方案
你之前使用的
FGenericPlatformMisc::GetMacAddress接口无返回的核心原因有两点:一是该接口本身已被UE废弃,二是Android 6.0及以上版本(Oculus Quest 2底层基于Android 10/12)默认禁止普通第三方应用获取设备真实硬件MAC地址,无权限时会返回空值或固定的02:00:00:00:00:00假地址。
方案1:JNI调用安卓原生接口获取(适合需要真实MAC的场景)
- 第一步:先配置权限
在UE项目的Project Settings > Platforms > Android > Advanced APK Packaging > Extra Permissions中添加两个权限:android.permission.ACCESS_WIFI_STATEandroid.permission.INTERNET
确保打包时权限不会被Oculus manifest配置覆盖。
- 第二步:C++实现JNI调用逻辑,封装到你的蓝图函数库中即可暴露给蓝图使用,代码示例:
#include "Android/AndroidApplication.h" #include "Android/AndroidJNI.h" FString GetAndroidMacAddress() { if (!FAndroidApplication::IsAvailable()) { return FString(); } JNIEnv* Env = FAndroidApplication::GetJavaEnv(); jobject GameActivity = FAndroidApplication::GetGameActivityThis(); // 获取WifiManager服务实例 jclass ContextClass = Env->FindClass("android/content/Context"); jfieldID WifiServiceField = Env->GetStaticFieldID(ContextClass, "WIFI_SERVICE", "Ljava/lang/String;"); jstring WifiServiceName = static_cast<jstring>(Env->GetStaticObjectField(ContextClass, WifiServiceField)); jmethodID GetSystemServiceMethod = Env->GetMethodID(ContextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); jobject WifiManager = Env->CallObjectMethod(GameActivity, GetSystemServiceMethod, WifiServiceName); // 获取当前Wifi连接信息 jclass WifiManagerClass = Env->FindClass("android/net/wifi/WifiManager"); jmethodID GetConnectionInfoMethod = Env->GetMethodID(WifiManagerClass, "getConnectionInfo", "()Landroid/net/wifi/WifiInfo;"); jobject WifiInfo = Env->CallObjectMethod(WifiManager, GetConnectionInfoMethod); // 读取MAC地址 jclass WifiInfoClass = Env->FindClass("android/net/wifi/WifiInfo"); jmethodID GetMacAddressMethod = Env->GetMethodID(WifiInfoClass, "getMacAddress", "()Ljava/lang/String;"); jstring MacJStr = static_cast<jstring>(Env->CallObjectMethod(WifiInfo, GetMacAddressMethod)); // 转换为UE字符串 const char* MacRaw = Env->GetStringUTFChars(MacJStr, nullptr); FString MacResult = FString(UTF8_TO_TCHAR(MacRaw)); Env->ReleaseStringUTFChars(MacJStr, MacRaw); // 拦截系统返回的假地址 if (MacResult == "02:00:00:00:00:00") { return FString(); } return MacResult; }
注意:如果是上架Oculus官方商店的普通应用,该方案大概率还是会返回空,仅适用于内部测试、企业级定制部署的场景,企业部署时可通过Quest设备管理后台开启MAC地址访问权限,即可正常获取真实值。
方案2:使用设备唯一标识替代MAC(兼容性最高,无需额外权限)
如果你的业务场景只是需要唯一标识设备,不需要真实MAC地址,直接使用UE官方提供的FPlatformMisc::GetDeviceId()接口即可,该接口在Quest平台下返回安卓原生Android ID,稳定性足够满足设备标识需求,无需额外权限,直接封装为蓝图节点即可全平台通用。
该方案的优势:
- 无权限申请要求,不会被平台安全策略拦截
- 不依赖Wifi连接状态,离线场景也可正常返回
- 全平台兼容,Windows/Android/Oculus均有稳定返回值
内容的提问来源于stack exchange,提问作者Slyn21
相关产品推荐
相关产品推荐

