您的位置:首页 > 移动开发 > Android开发

Android 获取手机存储信息详解(内存,外存等)

2016-02-23 21:13 561 查看
        android  获取手机存储信息详解(内存,外存等)

        android不像ios,android可以外接Sd卡,并且也会有内接的存储卡,此次专门研究下如何获取android的存储信息。
   
一、RAM内存
        RAM,也就是我们常说的手机内存。最早的内存大小才80M,而现在一般内存大小已经达到1G,近年来2G内存已经成为主流,也有一些手机是3.5G与4G、8G等大小。一般来说内存越大,运行起来更流程,起码我自己的手机才1G==早就想换个大点的了………言归正传,此时我们来获取android的内存大小。
        在android手机中,存在文件路径"/proc/meminfo“ 此为系统内存信息文件,第一行就是内存大小
        我们可以通过adb工具链接手机,打开调试模式,之后采用命令”adb pull /proc/meminfo "将其导出,用文本格式打开里面内容。
        


        所有可以通过该方式获取总内存(关键代码):
       
final String mem_path = "/proc/meminfo";// 系统内存信息文件,第一行为内存大小
Reader reader = null;
BufferedReader bufferedReader = null;

reader = new FileReader(mem_path);
bufferedReader = new BufferedReader(reader, 8192);
long totalRAMSize = Long.parseLong(bufferedReader.readLine().split("\\s+")[1]) * 1024L;//这里*1024是转换为单位B(字节)


        
        而获取内存可用大小有两种方式,一是和上面一个有个MemFree的参数,显示可用大小……而另一种方式则是直接使用android自带的类,获取当前的可用内存大小。
       第一种方式和获取总内存大小一样,我就不写了,第二种方式(关键代码):
        
       
<span style="white-space:pre">	</span>ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); //该接口可用获取很多设备信息,这里就不详叙了==
ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();
am.getMemoryInfo(memInfo);
long  availRAMsize = memInfo.availMem;


   
        至此,我们已经获取到了手机内存总大小与可用内存大小

二、ROM内部存储
       ROM,RAM ==之前一直傻傻分不清楚。后来稍加记忆,ROM里面的‘o’就是only 的意思,我就是理解为仅仅作为存储所用,所以是内部存储而不是内存==当然换个通俗易懂的方式,如果手机和电脑来比较的话,手机内存RAM,就是电脑的内存;手机内部存储ROM就是电脑的C盘,而手机的SD卡内置存储卡就对应电脑的D/E/F……盘 
        再次回归主题,要获取内部存储信息大小,可以通过android自带的类StatFs获取磁盘的信息。
       
<span style="white-space:pre">	</span>final StatFs statFs = new StatFs(Environment.getDataDirectory().getPath());//调用该类来获取磁盘信息(而getDataDirectory就是内部存储)
long tcounts = statFs.getBlockCount();//总共的block数
long counts = statFs.getAvailableBlocks() ; //获取可用的block数
long size = statFs.getBlockSize(); //每格所占的大小,一般是4KB==
long availROMSize = counts * size;//可用内部存储大小
long totalROMSize = tcounts *size; //内部存储总大小


       上面方法原理显而易见了==我就懒得说了……下面的才是重头戏

三、外置存储信息
       所谓举一反三,上面获取ROM内部存储信息的时候,已经用到了获取磁盘信息类StatFs,当然存储卡都算是磁盘的一种啦,我不信android里面设置这个类没有考虑到外置存储卡!
        果然,同意可以通过StatFs方式获取:
        
final StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath());//调用该类来获取磁盘信息(而getExternalStorageDirectory就是外置存储)
long tcounts = statFs.getBlockCount();//总共的block数
long counts = statFs.getAvailableBlocks() ; //获取可用的block数
long size = statFs.getBlockSize(); //每格所占的大小,一般是4KB==
long availROMSize = counts * size;//可用内部存储大小
long totalROMSize = tcounts *size; //内部存储总大小
<
4000
br />

        ……是的,我是无耻的复制粘贴了ROM里面的==|||
        当然修改一个磁盘地址getExternalStorageDirectory(看命名就知道了--一个是getDataDirectory,内部存储,一个是getExternalStorageDirectory,额外的存储目录……)
        当初以为到这里,大功告成…………然而,我还是太年轻
        写好代码之后,用自己烂烂的VIVO进行测试,插的是8G的卡发现,没有任何问题,再找了一台机器测试,16G的卡发现,显示的是4G……看清楚--是4G。。。。
        ……MADAN。。。这是什么东西,我手机存储卡明明是16G,结果显示4G……
        继续探究,观察源码打印Environment.getExternalStorageDirectory().getPath()地址,发现出来的是scard0,--自己看手机的存储卡地址,scard1,,,原来 android的官方文档上说,采用Enviroment.getExternalStorageDirectory()方法可以得到android设备的外置存储(即外插SDCARD),如果android设备有外插SDCARD的话就返回外插SDCARD的根目录路径,如果android设备没有外插SDCARD的话就返回android设备的内置SDCARD的路径。这套方案很快就被否决了,因为Enviroment类的这个方法里面的路径也是写死的,只有原生的android系统才使用这套方案,被更改过的anroid体统很多设备的路径都改了。
 
     除此之外,调用Environment.getExternalStorageDirectory(),返回的存储目录并不是系统内置的SD卡目录。
1.一部分手机将eMMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到Environment.getExternalStorageDirectory()这个结点。
此时,调用Environment.getExternalStorageDirectory(),则返回外置的SD的路径。
2.而另一部分手机直接将eMMC存储挂载在Environment.getExternalStorageDirectory()这个节点,而将真正的外置SD卡挂载到/mnt/external_sd、/mnt/sdcard2
等节点。
        


…………………………这样这个方法就不科学了啊…………好在,还是有其他方法,通过读取system/etc/vold.fstab文件的内容来获取存储设备路径

获取外置信息

1)先反射调用函数获取所有外载地址
2 ) 通过/system/etc/vold.fstab获取地址
3)通过getEnterStorage获取地址
4)所有地址进行汇总然后获取总大小和可用大小命名取最后
源码明天补--
附:android常见的SD卡存储位置

/storage/emulated/0/
/storage/extSdCard
/mnt/external_sd/
/mnt/sdcard2/
/mnt/sdcard/external_sd/
/mnt/sdcard-ext/
/mnt/sdcard/
/storage/sdcard0/
/mnt/extSdCard/
/mnt/extsd/
/mnt/emmc/
/mnt/extern_sd/
/mnt/ext_sd/
/mnt/ext_card/
/mnt/_ExternalSD/
/sdcard2/
/sdcard/
/sdcard/sd/
/sdcard/external_sd/
/mnt/sd/
/mnt/
/storage/
/mnt/sdcard/sd/
/mnt/exsdcard/
/mnt/sdcard/extStorages/SdCard/
/ext_card/
/storage/extSdCard
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 手机 android 内存