在存储文件时,为了保证有充足的剩余空间大小,通常需要知道系统内部或者sdcard的存储大小。下面提供一个工具类,记得是从网站搜的。
当下载或安装一个文件之前,往往会比较关心当前系统内存和SD卡上的剩余容量。
在做文件拷贝,移动操作时,检测目标目录的空间大小也是必须的。
Android系统提供了Environment 和StatFs两个类,来实现对容量的检测。
Environment:
getDataDirectory(): 获取应用存储空间文件对象。
getExternalStorageDirectory(): 获取SD卡文件对象。
getRootDirectory(): 获取系统空间文件对象。
StatFs:
getBlockCount(): 获取存储块数量。
getAvailableBlocks(): 获取存储块数量。
getBlockSize(): 获取存储块大小。
因为Android是基于Linux系统的,所以其没有盘符的概念,而且是以存储块来存储数据。所以获得容量的正确方式为:
1. 通过Environment获取需要检测容量的文件对象。
2. 构建StatFs对象。
3. 获取存储块数量。
4. 获取存储块大小。
5. 计算得出容量大小。
需要注意的是,通过getBlockSize()方法获取出来的值,是以字节做单位。
结果:
SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?
1.要获取SD卡上面的信息,必须先对SD卡有访问的权限,因此第一件事就是需要添加访问扩展设备的权限.
2.需要判断手机上面SD卡是否插好,如果有SD卡的情况下,我们才可以访问得到并获取到它的相关信息.
3.取得sdcard文件路径
4.获取block的SIZE
5.获取BLOCK数量
6.空闲的Block的数量
7.计算总空间大小和空闲的空间大小
存储容量检测 注意构建StatFs对象的参数合法性
LogCat 报错信息:
02-14 10:24:27.134: ERROR/(4355): statfs nokia failed, errno: 2
02-14 10:24:27.144: WARN/System.err(4355): java.lang.IllegalArgumentException
02-14 10:24:27.153: WARN/System.err(4355): at android.os.StatFs.native_setup(Native Method)
02-14 10:24:27.173: WARN/System.err(4355): at android.os.StatFs.(StatFs.java:32)
02-14 10:24:27.173: WARN/System.err(4355): at com.tmall.util.Devices.getBlock(Devices.java:161)
02-14 10:24:27.184: WARN/System.err(4355): at com.tmall.util.Devices.getUsedRatio(Devices.java:199)
02-14 10:24:27.184: WARN/System.err(4355): at com.tmall.nokia.Check.checkSDBlock(Check.java:271)
02-14 10:24:27.184: WARN/System.err(4355): at com.tmall.nokia.Check.run(Check.java:332)
02-14 10:24:27.195: WARN/System.err(4355): at java.lang.Thread.run(Thread.java:1019)
发生错误原因分析:
分析发生错误部分代码,发现在构建StatFs对象时出错
nokiaPath = "nokia"
StatFs sf = new StatFs(nokiaPath);
StatFs用于对系统的存储容量进行检测。报错是因为构建StatFs对象时使用了非法参数。"nokia"不是一个合法有效的参数,合法参数应该形如"sdcard"。
解决办法:
使用默认的路径及名称是最好的方法
nokiaPath = Environment.getExternalStorageDirectory().getPath();// nokiaPath ="/mnt/sdcard"
//nokiaPath = Environment.getExternalStorageDirectory().getName();// nokiaPath ="sdcard"
StatFs sf = new StatFs(nokiaPath);
如果一定需要自定义路径作为参数,也应使用类似下列格式的有效自定义路径
nokiaPath = "/mnt/sdcard/nokia/";
nokiaPath = "/sdcard/nokia/";
nokiaPath = "sdcard/nokia/";