如何检查设备在 Android Oreo API 26 及更高版本上的存储空间是否不足

Aru*_*abu 5 android android-intent android-8.0-oreo

如何检查设备在 Android 8 Oreo 上的存储空间是否不足。我在 Android 文档中看到API 26 中不推荐使用Intent.ACTION_DEVICE_STORAGE_LOW

此常量在 API 级别 26 中已弃用。 如果您的应用以 O 或更高版本为目标,则此广播将不再传送到清单中定义的任何 BroadcastReceiver。相反,强烈建议应用程序使用改进的 getCacheDir() 行为,以便系统可以在需要时自动释放存储空间。 - 安卓文档

他们鼓励我改用 getCacheDir()。

但是我对它的了解不多,因为 getCacheDir() 似乎将系统缓存目录路径作为 FILE 对象返回,该对象只能用于清除缓存等。

但我需要检查设备的设备存储空间是否不足。我希望有人能帮助我

Eri*_*rik 10

正如问题中正确所述,API 26Intent.ACTION_DEVICE_STORAGE_LOW已被弃用,Context#getCacheDir()建议改为使用API 26来从应用程序的缓存中释放空间。

这有多个问题(下面列举),但首先:请注意,保持缓存“合理小”(例如 1 MB)是一个好习惯,我引用:

getCacheDir()

返回一个 File 表示应用程序的临时缓存文件的内部目录。确保在不再需要每个文件时将其删除,并对您在任何给定时间使用的内存量实施合理的大小限制,例如 1MB。

注意:如果系统存储空间不足,它可能会在没有警告的情况下删除您的缓存文件。

(来源)

所以,这里存在三个问题:

  1. 我们应该清除缓存,但它可能已经相当小(例如 1 MB),因此清除它可能无法释放足够的空间让空闲存储再次变为正常(类似于Intent.ACTION_DEVICE_STORAGE_OK以前可用于此的已弃用)
  2. 正如所引用的,缓存很可能已经被系统清除了,因为存储空间很低,如果系统决定清除您的应用程序的缓存。因此,自己清除它可能不会释放任何存储空间。
  3. 该文档根本没有指定如何实际检测设备是否存储空间不足。

所以,清除缓存似乎没有帮助,所以我不会详细介绍如何做到这一点。

但是,根据这个答案,我们可以假设系统在 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
}
Run Code Online (Sandbox Code Playgroud)

Kotlin,来自Context(例如Activity):

if (cacheDir.usableSpace * 100 / cacheDir.totalSpace <= 10) { // Alternatively, use cacheDir.freeSpace
  // Handle storage low state
} else {
  // Handle storage ok state
}
Run Code Online (Sandbox Code Playgroud)

现在,是使用可用空间还是可用空间,这对我来说并不完全清楚。此处描述不同之处。

深入到 Android 源代码中,我发现了一个系统服务,我无法在我的代码中访问它,它检查低存储空间:DeviceStorageMonitorService. 它lowBytes从获取它的变量StorageManager#getStorageLowBytes,我也无法访问。如果这可以以某种非hacky 的方式实现,那将是一种获得低存储字节阈值的方法。在那里你会看到源代码使用getUsableSpace(),所以这就是为什么我选择它而不是getFreeSpace()我的代码片段。