如何在Android Oreo API 26及更高版本

时间:2017-11-15 14:48:59

标签: android android-intent android-8.0-oreo

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

  

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

他们鼓励我使用getCacheDir()代替。

但我不太了解它,因为getCacheDir()似乎将系统缓存目录路径作为FILE对象返回,该对象只能用于清除缓存或其他一些。

但是我需要检查设备是否在设备存储上运行不足。我希望有人会帮助我

2 个答案:

答案 0 :(得分:3)

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

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

  

getCacheDir()

     

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

     

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

(source)

所以,这里有三个问题:

  1. 我们应该清除缓存,但它可能已经相当小(例如1 MB),因此清除它可能无法释放足够的空间以使空闲存储再次变得正常(类似于已弃用的Intent.ACTION_DEVICE_STORAGE_OK以前可以用于此)
  2. 如上所述,系统已经清除了缓存,因为存储空间很小,系统可能会清除应用程序的缓存,如果它决定的话。因此,自己清理它可能不会释放任何存储空间。
  3. 文档根本没有说明如何实际检测设备是否存储不足。
  4. 因此,清除缓存似乎没有帮助,所以我不会详细介绍如何做到这一点。

    但是,根据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()在内部存储中提供目录