Unity3D 中用C#获得Android系统内存信息

Android 内存信息,可以通过java读取系统文件获得。可以在java中写好方法给C#调用。这里我们可以不通过在java里面写方法,直接只用unity提供调用java的封装,或许android内存信息。

		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,类型不对不会自动转换会抛出异常

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值