确定设备存储空间不起作用:android

时间:2016-06-24 19:51:17

标签: java android storage

我在安装或删除应用时使用以下代码确定设备上的可用存储空间,并且我的显示器中没有正确的可用空间。此代码在广播接收器中运行,该接收器在删除或安装应用程序时正在侦听。

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getAvailableBlocks();
long megAvailable = bytesAvailable / 1048576;
System.out.println("Megs Available :"+megAvailable);

当我在这里测试此代码时,得到的结果是:

我从12437MB开始(我们只说37MB,因为这是唯一会改变的数字)。

我添加了一个1MB的应用程序... 37 MB可用空间高达41 MB(应该减少)

我添加了一个12MB的应用程序...... 41 MB的可用空间减少到15 MB(减少太多)

我添加了一个大约1 MB的应用程序... 15 MB可用量下降到14 MB(也许这个工作正常)

然后我删除了一个1MB的应用...... 14MB的可用空间为14MB

我删除了一个2 MB的应用... 14MB保持在14MB

我删除了一个1MB的应用...... 14MB的可用空间高达19MB

我删除了一个12MB的应用程序.. 19 MB可用的容量为19MB ......

在进行此测试后,我尝试在删除或安装应用程序与获取设备存储空间之间添加5秒延迟,但数字仍然不正确。

除此之外,根据我的程序,我的总可用空间总是大约12.4 GB,我的手机设置说我有12.1 GB ...手机设置是否比我的程序更准确?

有没有办法获得更准确的数字?或者这种方法不是很可靠?或手机上的缓存数据使得数字不可靠?

1 个答案:

答案 0 :(得分:2)

您已使用的代码已弃用,适用于Android API 9或更高版本。您应该如何计算可用的存储空间:

使用getExternalFilesDirs方法(https://developer.android.com/reference/android/support/v4/content/ContextCompat.html#getExternalFilesDirs(android.content.Context,java.lang.String))获取外部存储目录的路径:

File[] externalStoragesPaths = ContextCompat.getExternalFilesDirs(getActivity(), null);

此方法是ContextCompat类(https://developer.android.com/reference/android/support/v4/content/ContextCompat.html)的成员,它提供了自API 4以来所有Context类功能的兼容性。 从getExternalFilesDirs返回的第一个路径将是外部存储的绝对路径,应用程序可以在其中放置它拥有的持久文件:

if(externalStoragesPaths != null) {
    File externalStoragePath = externalStoragesPaths[0]; 
}

然后您可以确定可用的存储空间:

API 9 - API 17:

long availableSpace = externalStoragePath.getFreeSpace(); // available space in bytes

API 18及以上:

long availableSpace = new StatFs(externalStoragePath.getPath()).getAvailableBytes(); 

您也可以尝试使用getUsableSpace()方法(https://developer.android.com/reference/java/io/File.html#getUsableSpace%28%29)或getAvailableBlocksLong()和getBlockSizeLong()方法,而不是getAvailableBlocks()和getBlockSize()。