最開始考慮使用中間靜態鏈接庫來調用手機系統自帶的API,但是在研究的過程中發現Android系統將電量等信息記錄在了固定的文件中,所以只需要在C#中直接讀取就可以而不需要中間庫.
a.Android版
1.通過C#直接讀取,下面的GetBatteryLevel()方法
- int GetBatteryLevel()
- {
- try
- {
- string CapacityString = System.IO.File.ReadAllText("/sys/class/power_supply/battery/capacity");
- return int.Parse(CapacityString);
- }
- catch (Exception e)
- {
- Debug.Log("Failed to read battery power; " + e.Message);
- }
- return -1;
- }
- }
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)
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)); } }