見出し画像

Magic Leap2 の バッテリ残量の取得 について

はじめに

この記事は、Magic Leap2 Advent Calendar 2022 の8日目です。
Magic Leap2 の バッテリ残量の取得 について説明します。


OnePlanet XR について

https://1planet.co.jp/xrconsulting.html

このブログ記事は OnePlanet XR によるものです。
OnePlanet XR は、AR/MR/VPS技術に専門特化したコンサルティングサービスです。豊富な実績を元に、AR/MR技術を活用した新たな事業の立ち上げ支援や、社内業務のデジタル化/DX推進など、貴社の必要とするイノベーションを実現いたします。

ご相談から受け付けております。ご興味ございましたらお問い合わせください。


Magic Leap2 の バッテリ残量の取得について

Magic Leap 1ではバッテリの情報をアプリケーション上で取得することができませんでしたが、Magic Leap2 ではバッテリ残量の取得が可能になりました。

今回はMagic Leap2 Compute Pack と Controller のバッテリ残量を取得する方法について説明します。


開発環境 / 動作環境

Unity Editor 2022.2.0b8.3023
Magic Leap SDK 1.1.0-dev1
Magic Leap XR Plugin 7.0.0.pre.1
Magic Leap2 OS 1.1.0-dev1 (B3E.221020.13-R.039_40)


ヒエラルキー

シーンを新規作成します。Main Cameraは削除し、XR Rigのプレファブをヒエラルキーに配置します。
Game Objectを作成し、名前を Battery Example を作成します。


BatteryManager

BatteryManager というスクリプトを作成します。

スクリプトは以下になります。

using System;
using UnityEngine;

public class BatteryManager
{
    public static int GetControllerBatteryLevel()
    {
#if UNITY_MAGICLEAP || UNITY_ANDROID
        using AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        if (activity == null)
        {
            Debug.LogError("Activity is null");
            return -1;
        }
        AndroidJavaObject filter = new AndroidJavaObject("android.content.IntentFilter");
        if (filter == null)
        {
            Debug.LogError("IntentFilter is null");
            return -1;
        }
        filter.Call("addAction", "com.magicleap.controller.action.BATTERY_CHANGED");
        using AndroidJavaObject intent = activity.Call<AndroidJavaObject>("registerReceiver", null, filter);
        if (intent == null)
        {
            Debug.LogError("Intent is null");
            return -1;
        }
        using AndroidJavaClass batteryManager = new AndroidJavaClass("android.os.BatteryManager");
        if (batteryManager == null)
        {
            Debug.LogError("BatteryManager is null");
            return -1;
        }
        string EXTRA_PRESENT = batteryManager.GetStatic<string>("EXTRA_PRESENT");
        string EXTRA_LEVEL = batteryManager.GetStatic<string>("EXTRA_LEVEL");
        bool isPresent = intent.Call<bool>("getBooleanExtra", EXTRA_PRESENT, false);
        return isPresent ? intent.Call<int>("getIntExtra", EXTRA_LEVEL, -1) : -1;
#else
    return -1;
#endif
    }

    public static int GetComputePackBatteryLevel()
    {
        return (int)Math.Floor(SystemInfo.batteryLevel * 100);
    }
}

ControllerはIntentを使ってバッテリ残量を取得します。ComputePackはSystemInfoから取得しています。(ComputePackのバッテリ残量は0~1%の値で返却するため、100倍にして小数桁を切り捨てます。)


Battery Example

Battery Example というスクリプトを作成し、作成したBattery Example Game Object にコンポーネントとして追加します。バッテリ残量の情報をテキストに設定するだけのシンプルなスクリプトです。スクリプトは以下になります。

using UnityEngine;
using TMPro;
using System;

public class BatteryExample : MonoBehaviour
{
    [SerializeField]
    private TextMeshProUGUI info;

    void Start()
    {
        var computePackBatteryLevel = BatteryManager.GetComputePackBatteryLevel();
        var controllerBatteryLevel = BatteryManager.GetControllerBatteryLevel();
        info.text = string.Format("Compute Pack {0}%\nController {1}%", computePackBatteryLevel, controllerBatteryLevel);
    }
}

バッテリ残量の表示

バッテリ残量のテキスト表示用のUIを作成します。以下の記事に従って構築してください。

上記の記事で作成したText(TMP)を BatteryExample の info フィールドに設定してください。


実行

起動するとMagic Leap2 の Compute Pack と Controller のバッテリ残量が表示されます。


OnePlanet XR

https://1planet.co.jp/xrconsulting.html

AR/MR/VPS技術に専門特化したコンサルティングサービス

Magic Leap2 を使ったソリューションのご検討の方からのお問い合わせ、お待ちしております。


お問い合わせ先

https://1planet.co.jp/xrconsulting.html#op_form


OnePlanet Tech Magazine

Magic Leap 1 、Magic Leap2 、スマホAR(Niantic Lightship ARDK、WebAR、VPSなど)といったAR技術全般をブログマガジンを連載しています。