我在安装或删除应用时使用以下代码确定设备上的可用存储空间,并且我的显示器中没有正确的可用空间。此代码在广播接收器中运行,该接收器在删除或安装应用程序时正在侦听。
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 ...手机设置是否比我的程序更准确?
有没有办法获得更准确的数字?或者这种方法不是很可靠?或手机上的缓存数据使得数字不可靠?
答案 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()。