Unity3D 中用C#获得Android系统内存信息
2016-08-12 16:49
417 查看
Android 内存信息,可以通过java读取系统文件获得。可以在java中写好方法给C#调用。这里我们可以不通过在java里面写方法,直接只用unity提供调用java的封装,或许android内存信息。
可以看到,就是把本来写在java的方法,用unity的封装调用一遍。这样,可以用C#完成java所有的功能,就是写起来很繁琐。这样的好处就是不用更新apk,就可以动态更新C#获得java调用的功能。
同样,我们可以通过这个方法生成一个java的uuid。
这种调用有3个注意点。
父类的常量,只能通过父类调用,不能通过子类调用。比如上面的Context的TELEPHONY_SERVICE
内部类的路径需要加$,比如android.provider.Settings$Secure
java函数的参数类型要对应,比如java函数需要long,那么c#就要传long,类型不对不会自动转换会抛出异常
public static String GetTotalMemory() { try { AndroidJavaObject fileReader = new AndroidJavaObject("java.io.FileReader", "/proc/meminfo"); AndroidJavaObject br = new AndroidJavaObject("java.io.BufferedReader", fileReader, 2048); string mline = br.Call<String>("readLine"); br.Call("close"); mline = mline.Substring(mline.IndexOf("MemTotal:")); mline = Regex.Match(mline, "(\\d+)").Groups[1].Value; return (int.Parse(mline) / 1000).ToString(); } catch(Exception e) { return SystemInfo.systemMemorySize.ToString(); } }
可以看到,就是把本来写在java的方法,用unity的封装调用一遍。这样,可以用C#完成java所有的功能,就是写起来很繁琐。这样的好处就是不用更新apk,就可以动态更新C#获得java调用的功能。
同样,我们可以通过这个方法生成一个java的uuid。
public static String GetUuid() { try { AndroidJavaClass androidActivityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = androidActivityClass.GetStatic<AndroidJavaObject>("currentActivity"); string telSer = new AndroidJavaClass("android.content.Context").GetStatic<String>("TELEPHONY_SERVICE"); AndroidJavaObject tm = activity.Call<AndroidJavaObject>("getSystemService", telSer); String tmDevice = "" + tm.Call<String>("getDeviceId"); String tmSerial = "" + tm.Call<String>("getSimSerialNumber"); AndroidJavaClass secure = new AndroidJavaClass("android.provider.Settings$Secure"); String aid = secure.GetStatic<String>("ANDROID_ID"); String androidId = "" + secure.CallStatic<String>("getString", activity.Call<AndroidJavaObject>("getContentResolver"), aid); long hcode = (long) tmDevice.GetHashCode() << 32; long lcode = (long) tmSerial.GetHashCode(); long mostSigBits = (long) androidId.GetHashCode(); long leastSigBits = hcode | lcode; AndroidJavaObject deviceUuid = new AndroidJavaObject("java.util.UUID", mostSigBits, leastSigBits); return deviceUuid.Call<String>("toString"); } catch (Exception e) { return "-1"; } }
这种调用有3个注意点。
父类的常量,只能通过父类调用,不能通过子类调用。比如上面的Context的TELEPHONY_SERVICE
内部类的路径需要加$,比如android.provider.Settings$Secure
java函数的参数类型要对应,比如java函数需要long,那么c#就要传long,类型不对不会自动转换会抛出异常
相关文章推荐
- C# 获得系统的内存信息
- 【转】Android 的cpu 硬盘 内存 网络设置 系统信息 硬件信息
- c#获取系统内存等信息
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- 【转】Android 的cpu 硬盘 内存 网络设置 系统信息 硬件信息
- android系统信息(内存、cpu、sd卡、电量、版本)获取
- Android系统信息(内存、cpu、sd卡、电量、版本)获取
- android系统信息(内存、cpu、sd卡、电量、版本)获取
- Android中如何修改系统信息(应用程序获得系统权限)
- android 的cpu 硬盘 内存 网络设置 系统信息 硬件信息
- Android中如何修改系统信息(应用程序获得系统权限)
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一) .
- C++编程中,利用WINDOWS API获得系统状态信息[CPU占用率,硬盘使用情况,内存使用情况]
- Android系统内存优化之二(系统内存信息)
- Android:系统信息(内存、cpu、sd卡、电量、版本)的获取
- android系统信息(内存、cpu、sd卡、电量、版本)获取
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)