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自带的类,获取当前的可用内存大小。        第一种方式和获取总内存大小一样,我就不写了,第二种方式(关键代码):                 
 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获取磁盘的信息。        
 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; //内部存储总大小


        ……是的,我是无耻的复制粘贴了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


更多相关文章

  1. Android 要注意的内存占用问题
  2. Android:微软的金钱机器(更新)
  3. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruC
  4. Android 单独控件实现不同字体大小、不同颜色
  5. webView自适应屏幕大小
  6. Android技术之使用Handler引发的内存泄露
  7. Android获取屏幕宽高、屏幕密度、手动计算view大小

随机推荐

  1. Android系列学习:JSON解析
  2. Android(安卓)TCP/UDP开源库NetworkDebug
  3. android 获得手机号相关
  4. 硬件访问服务2之让Android应用程序访问C
  5. android https 双向认证
  6. 三星 Galaxy Nexus,4.0.3/华为荣耀U8860
  7. Android(安卓)在Service中调用Activity
  8. Android学习札记47:TextView显示Html类解
  9. RemoteViews用法一:widget简单用法
  10. android binder 讲解之权限管理