如何在Android 8 Oreo上检查设备是否存储空间不足。我在Android文档中看到API 26中不推荐使用 Intent.ACTION_DEVICE_STORAGE_LOW 。
此常量在API级别26中已弃用。 如果您的应用程序的目标是O或以上,则此广播将不再发送到清单中定义的任何BroadcastReceiver。相反,强烈建议应用程序使用改进的getCacheDir()行为,以便系统在需要时自动释放存储空间。 - Android文档
他们鼓励我使用getCacheDir()代替。
但我不太了解它,因为getCacheDir()似乎将系统缓存目录路径作为FILE对象返回,该对象只能用于清除缓存或其他一些。
但是我需要检查设备是否在设备存储上运行不足。我希望有人会帮助我
答案 0 :(得分:3)
正如问题中所述,API 26 Intent.ACTION_DEVICE_STORAGE_LOW
已弃用,建议使用Context#getCacheDir()
来释放应用程序缓存中的空间。
这有多个问题(下面列举),但首先:请注意,保持缓存“合理地小”(例如1 MB)是个好习惯,我引用:
getCacheDir()
返回表示应用程序临时缓存文件的内部目录的文件。确保在不再需要时删除每个文件,并对在任何给定时间使用的内存量(例如1MB)实施合理的大小限制。
警告:如果系统存储空间不足,可能会在没有警告的情况下删除缓存文件。
所以,这里有三个问题:
Intent.ACTION_DEVICE_STORAGE_OK
以前可以用于此)因此,清除缓存似乎没有帮助,所以我不会详细介绍如何做到这一点。
但是,根据this answer,我们可以假设在10%的空闲存储空间下,系统进入我们想要检测的低存储状态。这个数字是Android的默认值,但根据链接的答案,设备制造商(或ROM开发人员)几乎无法更改它。
此时,对我而言,这10%是一个神奇的数字,我想知道我是否可以通过编程方式确定此阈值。如果你知道怎么做,请编辑我的答案,自己发一个答案或评论我的答案。
要使用getCacheDir()
执行此操作,您可以使用以下内容:
Java,来自Context
(例如Activity
):
File cacheDir = getCacheDir();
if (cacheDir.getUsableSpace() * 100 / cacheDir.getTotalSpace() <= 10) { // Alternatively, use cacheDir.getFreeSpace()
// Handle storage low state
} else {
// Handle storage ok state
}
来自Context
的Kotlin(例如Activity
):
if (cacheDir.usableSpace * 100 / cacheDir.totalSpace <= 10) { // Alternatively, use cacheDir.freeSpace
// Handle storage low state
} else {
// Handle storage ok state
}
现在,无论是使用可用空间还是可用空间,这对我来说并不完全清楚。区别在于here。
潜入Android源代码我找到了一个系统服务,我无法在我的代码中访问,检查低存储空间:DeviceStorageMonitorService
。它从StorageManager#getStorageLowBytes
获取lowBytes
变量,我无法访问该变量。如果以某种非hacky方式实现这一点,那将是获得低存储字节阈值的一种方法。在那里,您看到来源使用了getUsableSpace()
,因此我为代码片段选择了getFreeSpace()
而不是sqrt( value( 1-value ) / 10000)
。
答案 1 :(得分:-3)
评论中由greenapps回答:
一旦
getCacheDir()
传递到已用存储的路径,您就可以使用该路径来确定该分区的大小和可用空间&#39;
getCacheDir()
在内部存储中提供目录