You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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_STATE
    • android.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:36:04