Unity获取Android手机的RAM和剩余RAM和ROM

这篇具有很好参考价值的文章主要介绍了Unity获取Android手机的RAM和剩余RAM和ROM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

项目工作需要,在游戏APP运行时,获取当前手机的剩余运行内存RAM和ROM。并且要适用于不同的项目,思来想去。最终想到这样的办法,具体的获取的方法在Android工程中实现,然后生成aar ,在Unity中调用。


一、Android工程方法的实现

用AndroidStudio创建一个新项目。创建一个com.pub.mylibrary包名。然后创建一个Unity2Android类。
代码如下(示例):

package com.pub.mylibrary;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.util.Log;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.ActivityManager.MemoryInfo;
import android.text.format.Formatter;



public class Unity2Android extends Activity {
    //unity项目启动时的上下文
    private  Activity unityActivity;
    private  static Context context;

    protected void  onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
    }

    /**
     * 利用反射机制获取unity项目的上下文
     * @return
     */
    Activity getActivity(){
        if (null == unityActivity){
            try {
                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
                unityActivity = activity;
                context = activity;
            } catch (ClassNotFoundException e) {
                System.out.println(e.getMessage());
            } catch (IllegalAccessException e) {
                System.out.println(e.getMessage());
            } catch (NoSuchFieldException e) {
                System.out.println(e.getMessage());
            }
        }
        return unityActivity;
    }


    /**
     * Android调用Unity的方法
     * @param gameObjectName    调用的GameObject的名称
     * @param functionName      方法名
     * @param args              参数
     * @return                  调用是否成功
     */
    boolean CallUnity(String gameObjectName ,String functionName ,String args){
        try{
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
            method.invoke(classtype,gameObjectName,functionName,args);
            return  true ;
        }catch (ClassNotFoundException e) {

        } catch (NoSuchMethodException e) {
            System.out.println(e.getMessage());
        } catch (IllegalAccessException e) {
            System.out.println(e.getMessage());
        } catch (InvocationTargetException e) {

        }
        return  false ;
    }

    /**
     Unity调用安卓的方法
     * Toast显示unity发送过来的内容
     * @param content           消息的内容
     * @return                  调用是否成功
     */
    public boolean ShowToast(String content){
        Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
        CallUnity("Main Camera","FromAndroid", "hello unity i'm android");
        return  true ;
    }

    public long getAvailMemory(){
        unityActivity =  getActivity();
        ActivityManager am = (ActivityManager)unityActivity.getSystemService(Context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
        am.getMemoryInfo(mi);

        // 取得剩余的内存空间
        //字符类型转换
        long availMem = mi.availMem / (1024 * 1024);
        //String availMemStr = formateFileSize(mi.availMem);
        //return availMemStr;
        return availMem;
    }

    /**
     *   获取android总运行内存大小
     *
     */
    public  long getTotalMemory() {
        String str1 = "/proc/meminfo";// 系统内存信息文件
        String firstLine = null;
        int initial_memory = 0;
        try {
            FileReader localFileReader = new FileReader(str1);
            BufferedReader localBufferedReader = new BufferedReader(localFileReader, 8192);
            firstLine = localBufferedReader.readLine().split("\\s+")[1];
            localBufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (firstLine != null){
            initial_memory = (int)Math.ceil((new Float(Float.valueOf(firstLine)/(1024 * 1024 )).doubleValue()));
        }
        return initial_memory * 1024 ;
    }

    private String formateFileSize(long size){
        unityActivity =  getActivity();
        return Formatter.formatFileSize(unityActivity, size);
    }

    public long appSize(){
        Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
        Debug.getMemoryInfo(memoryInfo);
        long total = memoryInfo.getTotalPss() / 1024;
        return total;
    }



}

二、生成aar

在AndroidStudio中Build下的Make Module 。然后在build 下的outputs 下的aar中找到对应生成的aar。
unity 获取手机内存,android,unity,游戏引擎

三、Untiy中的调用

把第二步骤生成的aar文件复制到Unity目录下Plugins中下的Android文件夹下。Unity中调用方法为

AndroidJavaObject _ajc;
[DllImport("__Internal")]
public static extern int _showTest();
void Start()
{
	 _ajc = new AndroidJavaObject("com.pub.mylibrary.Unity2Android");
}

 /// <summary>
    /// 当前设备的RAM
    /// </summary>
    /// <returns></returns>
    private float getTotalMemory()
    {
        long totalMemory = 0;
#if UNITY_ANDROID
        try
        {
            totalMemory = _ajc.Call<long>("getTotalMemory");
        }
        catch (System.Exception e)
        {
            totalMemory = 0;
            throw;
        }
#elif UNITY_IOS
        totalMemory = 0;
#endif
        return totalMemory;
    }

/// <summary>
    /// 当前设备剩余的RAM
    /// </summary>
    /// <returns></returns>
    private float getAvailMemory()
    {
        long availMemory = 0;
#if UNITY_ANDROID
        try
        {
            availMemory = _ajc.Call<long>("getAvailMemory");
        }
        catch (System.Exception e)
        {
            availMemory = 0;
            throw;
        }
#elif UNITY_IOS
        //try
        //{
        //    availMemory = (long)availableMemory();
        //}
        //catch (System.Exception e)
        //{

        //    availMemory = 0;
        //    throw;
        //}     
#endif       
        return availMemory;
    }


    /// <summary>
    /// 当前APP占用的的RAM
    /// </summary>
    /// <returns></returns>
    private float getAppOccupyMemory()
    {
        long appOccupyMemory = 0;
#if UNITY_ANDROID
        try
        {
            appOccupyMemory = _ajc.Call<long>("appSize");
        }
        catch (System.Exception e)
        {
            appOccupyMemory = 0;
            throw;
        }
#elif UNITY_IOS
        //try
        //{
        //    appOccupyMemory = (long)usedMemory();
        //}
        //catch (System.Exception e)
        //{
        //    appOccupyMemory = 0;
        //    throw;
        //}     
#endif       
        return appOccupyMemory;
    }

以上就是实现的大致过程,仅仅做个记录,怕忘记怎么实现。文章来源地址https://www.toymoban.com/news/detail-574988.html

到了这里,关于Unity获取Android手机的RAM和剩余RAM和ROM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序手机号授权获取收费(手机号快速验证组件)剩余次数查看购买

    登录微信公众平台 ,在管理---》付费管理下查看,已用次数和剩余次数 该能力旨在帮助开发者向用户发起手机号申请,并且 必须经过用户同意后 ,开发者才可获得由平台验证后的手机号,进而为用户提供相应服务。 该能力与手机号实时验证组件的区别为: 手机号快速验证

    2024年02月22日
    浏览(77)
  • 【Android实现 资源路径/手机内存/网络文件 下的视频播放】

    业务场景:安卓实现播放视频的功能,支持播放不同类型资源下的视频,下面在使用中封装了一个方法,可以根据需要修改调用 这段代码是一个视频播放器的方法。根据传入的视频路径和视频类型,它会选择不同的播放逻辑。 如果视频类型是\\\"network\\\",则会处理网络文件的播

    2024年02月16日
    浏览(44)
  • Android动态获取手机是否是充电状态

    参考谷歌官方文档:https://developer.android.google.cn/topic/performance/power 在应用中执行某些操作 , 如软件云端备份 , 从服务器端获取最新版本号 , 从服务器端缓存最新软件安装包 , 固件版本 , 等操作 , 最好都在充电状态 , 我这边是做一个需求,电池容量校准,校准条件是需要在连接充

    2023年04月08日
    浏览(38)
  • Android 手机来电 获取来电信息,接听/挂断电话

    目录 1.需求描述 2.实现原理 第一个:手机来电状态 第二个:获取手机来电号码 第三个:接听和挂断电话 1.需求描述 监听用户手机来电,弹起App内自定义的来电展示,并且展示来电电话,用户可以接通和挂断。 2.实现原理 这儿我就总结下手机来电、获取手机号码和接听/挂断

    2024年02月12日
    浏览(52)
  • Android 获取手机已安装的应用列表(适配)

    加上权限才能获取到所有的应用 低版本的手机 可以用else里边的方法 也可以用 Intent的action 是:Intent.ACTION_MAIN 这个不要传错。 水平有限,如有问题欢迎评论区留言指正。 如果在高版本上有问题的话建议将 targetSdkVersion设置成26试试。 关注我获取更多知识或者投稿

    2024年02月13日
    浏览(43)
  • android开发获取手机麦克风设备信息

    之前为了测试蓝牙耳机的麦克,想从蓝牙耳机的麦克录音。尝试发现三星、小米自带的录音机并不能从蓝牙录音。看了网上一篇文章,提供了一个特定的录音APP,才支持开启蓝牙录音功能。 非常令人疑惑。想到现在的手机,有不只一个麦克风,是否能开发一个可选择录音源的

    2024年04月16日
    浏览(46)
  • 【Android】小米手机 Root全攻略:轻松获取手机最高权限

    需求 作为一个贫穷的米粉,目前为止买的手机都是小米的,一开始就冲着它的“发烧”而去,米1、米4、米8、K50,除了米8外,都刷过机,root过。 除了米1忽然有一天罢工之后,不能使用,其他手机都依然辛苦任职中。 K50 是最近买的,先想到的就是root掉,本来以为网上资料

    2024年02月08日
    浏览(101)
  • android 手机获取root权限(刷入magisk面具方式)_获取刷入模块_MIUI_android7/android12实践

    Magisk安装教程 - Magisk中文网 (magiskcn.com) android12: How to Root Xiaomi Redmi Note 11T Pro / 11T Pro+ using Magisk without TWRP (getdroidtips.com) 视频教程 ★ bigstar ★ 玩机必看!带你入坑安卓刷机,小白也能看懂的ROOT基础指南来啦!_哔哩哔哩_bilibili 将前面列出的参考都看一遍 最好把文章结尾的基

    2024年02月06日
    浏览(91)
  • 【Android开发基础】手机传感器信息的获取

    描述:关于传感器的使用,我在同栏目下发了一篇关于传感器(方向传感器、加速度传感器)的使用,这篇博客主要以获取不同手机所支持的传感器信息为主,具体如何使用这些传感器,需要自己进行查阅和学习,也可以私聊我。 博客:传感器(方向传感器、加速度传感器)

    2024年02月10日
    浏览(103)
  • android开发:获取手机IP和UDP广播

            UDP广播在通讯双方互相不知道对方IP的情况下很有用。这种情形我们也可以用遍历网段来实现,但是比较粗暴,如果网段比较大,不是最多256台主机的C类网段的话,很难做遍历。         UDP广播是解决这种问题的标准方案。         注意,广播和多播是不同的,广

    2024年02月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包