Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定设备存储空间不工作:android_Java_Android_Storage - Fatal编程技术网

Java 确定设备存储空间不工作:android

Java 确定设备存储空间不工作:android,java,android,storage,Java,Android,Storage,安装或删除应用程序时,我正在使用以下代码确定设备上可用的存储空间,我的显示器上打印的可用空间不正确。当删除或安装应用程序时,此代码在正在侦听的广播接收器中运行 StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getAvailableBlocks(); long megA

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

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可用空间(减少太多)

我添加了一个大约1MB的应用程序。。。15 MB可用空间下降到14 MB(可能这一个工作正常)

然后我删除了一个1MB的应用程序。。。14MB可用空间保持在14MB可用空间

我删除了一个2 MB的应用程序。。。14MB保持在14MB

我删除了一个1MB的应用程序。。。14MB可用空间增加到19MB可用空间

我删除了一个12MB的应用程序。。19MB可用空间停留在19MB

在做了这个测试之后,我尝试在删除或安装应用程序和获取设备存储空间之间增加5秒的延迟,但数字仍然不正确

除此之外,根据我的程序,我的总可用空间总是在12.4GB左右,我的手机设置显示我有12.1GB。。。手机设置是否比我的程序更准确


有没有办法获得更准确的数字?还是这种方法不太可靠?或者手机上的缓存数据导致号码不可靠?

您使用的代码不适用于Android API 9或更高版本。下面是计算可用存储空间的方法:

使用getExternalFilesDirs方法(,java.lang.String))获取外部存储目录的路径:

File[] externalStoragesPaths = ContextCompat.getExternalFilesDirs(getActivity(), null);
此方法是ContextCompat类()的成员,该类为自API 4以来的所有上下文类功能提供兼容性。 从GetExternalFileDirs返回的第一个路径将是外部存储的绝对路径,应用程序可以将其拥有的持久性文件放置在该路径中:

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()方法()或getAvailableBlocksLong()和getBlockSizeLong()方法,而不是getAvailableBlocks()和getBlockSize()。

您的意思是对API 9-17执行“externalStoragesPaths.getFreeSpace()”,对API 18及以上版本执行“externalStoragesPaths.getPath()”吗?或者你想用“文件”?看看我编辑过的答案,现在我把它弄得更正确更清楚了。这个方法给我的结果和我在问题中发布的方法一样。。。也许每次下载或删除一个应用程序时都无法获得准确的MB存储值?请尝试使用我添加到答案中的方法。另外,您可以尝试使用StatFs中的getFreeSpace()方法,并将其与其他方法进行比较。