• Unity获取Android和iOS手机系统电量及网络状况


      最开始考虑使用中间静态链接库来调用手机系统自带的API,但是在研究的过程中发现Android系统将电量等信息记录在了固定的文件中,所以只需要在C#中直接读取就可以而不需要中间库.

      a.Android版

      1.通过C#直接读取,下面的GetBatteryLevel()方法

    1.  int GetBatteryLevel()  
    2.     {  
    3.         try  
    4.         {  
    5.             string CapacityString = System.IO.File.ReadAllText("/sys/class/power_supply/battery/capacity");  
    6.             return int.Parse(CapacityString);  
    7.         }  
    8.         catch (Exception e)  
    9.         {  
    10.             Debug.Log("Failed to read battery power; " + e.Message);  
    11.         }  
    12.         return -1;  
    13.     }  
    14. }  

      b.iOS版

      iOS需要用到xcode编写.a静态链接库

      1.在xcode编写.mm文件,实现C++调用iOS的API得到手机电量,部分代码如下:

      

        float getiOSBatteryLevel()
        {
          [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
          return [[UIDevice currentDevice] batteryLevel];
        }

       

      2.将上面.mm编译好的.a文件放入Unity工程Assets-Plugins-iOS下(路径不能错);在C#中使用下面的方法调用:

    [ DllImport( "__Internal" )]
    private static extern float getiOSBatteryLevel();

    在C#调用此函数就可获得iOS电量

      至于网络状况,Unity自带API就可以获得

      Application.interReachability 

    NetworkReachability.NotReachability网络不可达
    NetworkReachability.ReachableViaCarrierDataNetwork 通过运营商数据网络可达
    NetworkReachability.ReachableViaLocalAreaNetwork 通过局域网络可达(wifi)
     
    ====================== 部分安卓手机不能使用,因为厂家可能修改文件结构,可以考虑下面的方法===============
    在unity工程建立安卓通信,在安卓侧监听电量,主要使用如下代码
    在主Activity里加入监听
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SystemUtil.registerBatteryReceiver(this);
        }

    监听方法

        public static int getBatteryState() {
            return batteryState;
        }
    
        public static void registerBatteryReceiver(Context mainContext) {
            if (batteryLevel == 0) {
                BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
    
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
                            batteryLevel = intent.getIntExtra("level", 0);
    
                            int curbatteryState = intent.getIntExtra("status", 0);
                            SetNewBatteryState(curbatteryState);
                        }
                    }
                };
                mainContext.registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
            }
        }
  • 相关阅读:
    DNS隧道
    记录上锁(fcntl)
    posix对线程的调整
    MySQL创建存储过程
    MySQL的WHERE语句中BETWEEN与IN的用法和他们的区别
    mysql中distinct
    线程的工作方式-流水线
    可执行程序的生成过程
    线程高级编程
    time函数及其用法
  • 原文地址:https://www.cnblogs.com/BobbyWeaver/p/5118118.html
Copyright © 2020-2023  润新知