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

Meta Quest2/3 Unity SDK:如何获取电池电量信息

获取Meta Quest 2/3 头显及手柄电池电量的编程方案

一、Unity + Meta XR SDK 实现

如果用Unity开发Quest应用,Meta XR SDK(原Oculus Integration)提供了直接的API来获取电量:

  1. 先将Meta XR SDK导入项目,在Oculus开发者后台创建应用并配置App ID到项目的Oculus设置中。
  2. 代码示例:
using Oculus.Platform;
using UnityEngine;

public class BatteryMonitor : MonoBehaviour
{
    void Start()
    {
        // 初始化Platform SDK
        Core.Initialize();
    }

    void Update()
    {
        // 获取头显电量(0-100)
        if (Battery.IsInitialized())
        {
            int headsetBattery = Battery.GetChargePercent();
            Debug.Log($"头显电量: {headsetBattery}%");
        }

        // 获取所有激活手柄的电量
        foreach (var controller in OVRInput.GetActiveControllers())
        {
            var batteryPercent = OVRInput.GetControllerBatteryPercent(controller);
            if (batteryPercent.HasValue)
            {
                int controllerBattery = Mathf.RoundToInt(batteryPercent.Value * 100);
                Debug.Log($"{controller} 电量: {controllerBattery}%");
            }
        }
    }
}

注意:构建时需确保启用Oculus Platform相关权限,无需额外申请电池权限,SDK会自动处理。

二、原生Android(Java)实现

Quest基于Android系统,可直接通过Android API结合Meta的输入设备接口获取电量:

头显电量

利用Android系统的BatteryManager获取:

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;

public class BatteryHelper {
    public static int getHeadsetBattery(Context context) {
        Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        
        return level == -1 || scale == -1 ? -1 : (int) (((float) level / scale) * 100);
    }
}

手柄电量

通过InputManager识别Quest手柄并读取电池属性:

import android.content.Context;
import android.hardware.input.InputManager;
import android.view.InputDevice;

public class ControllerBatteryHelper {
    public static float getControllerBattery(Context context) {
        InputManager inputManager = (InputManager) context.getSystemService(Context.INPUT_SERVICE);
        for (int deviceId : inputManager.getInputDeviceIds()) {
            InputDevice device = inputManager.getInputDevice(deviceId);
            if (device != null && (device.getName().contains("Oculus Touch") || device.getName().contains("Meta Touch"))) {
                return device.getMotionRange(InputDevice.MOTION_RANGE_BATTERY).getCurrentValue();
            }
        }
        return -1f;
    }
}

返回值为0-1的浮点数,转成百分比需乘以100。

三、OpenXR 通用方案(跨引擎)

如果使用OpenXR标准开发,可通过XR_EXT_battery扩展获取头显和手柄的电量:

#include <openxr/openxr.h>

XrResult RetrieveBatteryLevel(XrSession session, XrSpace targetSpace, float* outPercentage) {
    XrBatteryStateEXT batteryState{};
    batteryState.type = XR_TYPE_BATTERY_STATE_EXT;
    
    XrResult result = xrGetBatteryStateEXT(session, targetSpace, &batteryState);
    if (XR_SUCCEEDED(result)) {
        *outPercentage = batteryState.batteryPercentage;
    }
    return result;
}

注意:需先查询运行时是否支持XR_EXT_battery扩展,Meta Quest的OpenXR运行时默认支持该扩展。


内容的提问来源于stack exchange,提问作者MatterGoal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:45:06