Android获取手机及外设存储空间

在存储文件时,为了保证有充足的剩余空间大小,通常需要知道系统内部或者sdcard的存储大小。下面提供一个工具类,记得是从网站搜的。

 

当下载或安装一个文件之前,往往会比较关心当前系统内存和SD卡上的剩余容量。

在做文件拷贝,移动操作时,检测目标目录的空间大小也是必须的。

 

Android系统提供了Environment 和StatFs两个类,来实现对容量的检测。

  Environment:

    getDataDirectory(): 获取应用存储空间文件对象。

    getExternalStorageDirectory(): 获取SD卡文件对象。

    getRootDirectory(): 获取系统空间文件对象。

  StatFs: 

    getBlockCount(): 获取存储块数量。

    getAvailableBlocks(): 获取存储块数量。

    getBlockSize(): 获取存储块大小。

因为Android是基于Linux系统的,所以其没有盘符的概念,而且是以存储块来存储数据。所以获得容量的正确方式为:

  1. 通过Environment获取需要检测容量的文件对象。

  2. 构建StatFs对象。

  3. 获取存储块数量。

  4. 获取存储块大小。

  5. 计算得出容量大小。

需要注意的是,通过getBlockSize()方法获取出来的值,是以字节做单位。

public class TestActivity extends Activity {
    private String TAG = "Status";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        File data = Environment.getDataDirectory();
        StatFs sf = new StatFs(data.getPath());
        int availableBlocks = sf.getAvailableBlocks();
        Log.d(TAG, "可用存储块数量:" + availableBlocks);
        int blockCount = sf.getBlockCount();
        Log.d(TAG, "总存储块数量:" + blockCount);
        int size = sf.getBlockSize();
        Log.d(TAG, "存储块大小:" + size + "字节");
        int totalSize = blockCount * size;
        Log.d(TAG, "总空间:" + totalSize + "字节");
        int availableSize = availableBlocks * size;
        Log.d(TAG, "可用空间:" + availableSize + "字节");
    }
}

结果:

说明: C:\Users\lyj\AppData\Local\YNote\Data\qq385806FC59541EAF2F21221DA03B1769\515e04cff3cd4193b43c03a97cda1327\92216003631.jpeg

SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?

1.要获取SD卡上面的信息,必须先对SD卡有访问的权限,因此第一件事就是需要添加访问扩展设备的权限.

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.需要判断手机上面SD卡是否插好,如果有SD卡的情况下,我们才可以访问得到并获取到它的相关信息.

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

3.取得sdcard文件路径

File path = Environment.getExternalStorageDirectory(); 
StatFs statfs = new StatFs(path.getPath());

4.获取block的SIZE

long blocSize = statfs.getBlockSize();

5.获取BLOCK数量

long totalBlocks = statfs.getBlockCount();

6.空闲的Block的数量

long availaBlock = statfs.getAvailableBlocks();

7.计算总空间大小和空闲的空间大小

public long getAvailaleSize(){
  File path = Environment.getExternalStorageDirectory(); //取得sdcard文件路径
  StatFs stat = new StatFs(path.getPath()); 
  long blockSize = stat.getBlockSize(); 
  long availableBlocks = stat.getAvailableBlocks();
  return availableBlocks * blockSize; 
  //(availableBlocks * blockSize)/1024      KIB 单位
  //(availableBlocks * blockSize)/1024 /1024  MIB单位
}
public long getAllSize(){   File path = Environment.getExternalStorageDirectory();   StatFs stat = new StatFs(path.getPath());   long blockSize = stat.getBlockSize();   long availableBlocks = stat.getBlockCount();   return availableBlocks * blockSize; }

 

存储容量检测 注意构建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/";  

 

以合法的路径及名称作为参数,一般类似以"/mnt/sdcard" 或"sdcard/"开头的路径都是正确的。针对不同硬件,可能需要在编程中通过测试,使用有效格式。

posted on 2015-01-28 21:26  qiaolanqi  阅读(1074)  评论(0编辑  收藏  举报

导航