Unity 一个电量电耗获取

复制代码
using UFramework.Runtime;
using UnityEngine;
using UnityEngine.UI;

namespace GameMain
{
    public class PowerTest : BehaviourBase
    {
        float e = 0;

        [SerializeField] private Text _text1;
        [SerializeField] private Text _text2;

        protected override void UpdateEx()
        {
            base.UpdateEx();
            e = Power.electricity;
            _text1.text = $"电池总容量{Power.capacity}毫安,电压{Power.voltage}伏";
            _text2.text =
                $"实时电流{e}毫安,实时功率{(int)(e * Power.voltage)},满电量能玩{((Power.capacity / e).ToString("f2"))}小时";
        }
    }


    public class Power
    {
        static public float electricity
        {
            get
            {
#if UNITY_ANDROID
                //获取电流(微安),避免频繁获取,取一次大概2毫秒
                float electricity = (float)manager.Call<int>("getIntProperty", PARAM_BATTERY);
                //小于1W就认为它的单位是毫安,否则认为是微安
                return ToMA(electricity);
#else
            return -1f;
#endif
            }
        }

        //获取电压 伏
        static public float voltage { get; private set; }

        //获取电池总容量 毫安
        static public int capacity { get; private set; }

        //获取实时电流参数
        static object[] PARAM_BATTERY = new object[] { 2 }; //BatteryManager.BATTERY_PROPERTY_CURRENT_NOW)
        static AndroidJavaObject manager;

        static Power()
        {
#if UNITY_ANDROID
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            manager = currActivity.Call<AndroidJavaObject>("getSystemService", new object[] { "batterymanager" });
            capacity = (int)(ToMA((float)manager.Call<int>("getIntProperty", new object[] { 1 })) /
                             ((float)manager.Call<int>("getIntProperty", new object[] { 4 }) /
                              100f)); //BATTERY_PROPERTY_CHARGE_COUNTER 1 BATTERY_PROPERTY_CAPACITY 4

            AndroidJavaObject receive = currActivity.Call<AndroidJavaObject>("registerReceiver",
                new object[]
                {
                    null,
                    new AndroidJavaObject("android.content.IntentFilter",
                        new object[] { "android.intent.action.BATTERY_CHANGED" })
                });
            if (receive != null)
            {
                voltage = (float)receive.Call<int>("getIntExtra", new object[] { "voltage", 0 }) /
                          1000f; //BatteryManager.EXTRA_VOLTAGE
            }
#endif
        }

        static float ToMA(float maOrua)
        {
            return maOrua < 10000 ? maOrua : maOrua / 1000f;
        }
    }
}
复制代码

 

posted @   减肥的程序  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示