Google不幸地计划破坏存储权限,以使应用程序无法使用标准File API(和文件路径)访问文件系统。许多人反对它,因为它改变了应用程序访问存储的方式,并且在许多方面都是受限制的有限API。
因此,如果我们想处理各种问题,我们将需要在将来的某些Android版本上完全使用SAF(存储访问框架)(在Android Q上,我们至少可以暂时使用一个标志来使用常规存储权限)。存储卷并到达那里的所有文件。
因此,例如,假设您要制作一个文件管理器并显示设备的所有存储卷,并为每个文件显示有多少总字节和可用字节。这样的事情看起来非常合法,但是由于我找不到找到这种方法的方法。
从API 24(此处)开始,我们终于可以列出所有存储卷,如下所示:
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
val storageVolumes = storageManager.storageVolumes
Run Code Online (Sandbox Code Playgroud)
事实是,此列表上的每个项目都没有功能来获取其大小和可用空间。
但是,以某种方式,Google的“ Google提供的文件”应用程序设法获得了该信息,而没有获得任何形式的许可:
并在装有Android 8的Galaxy Note 8上进行了测试。甚至没有最新版本的Android。
因此,这意味着即使在Android 8上,也应该有一种无需任何许可即可获取此信息的方法。
有一些类似于获得自由空间的东西,但是我不确定是否确实如此。虽然如此。这是它的代码:
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
val storageVolumes = storageManager.storageVolumes
AsyncTask.execute {
for (storageVolume in storageVolumes) {
val uuid: UUID = storageVolume.uuid?.let { UUID.fromString(it) } ?: StorageManager.UUID_DEFAULT
val allocatableBytes = storageManager.getAllocatableBytes(uuid)
Log.d("AppLog", "allocatableBytes:${android.text.format.Formatter.formatShortFileSize(this,allocatableBytes)}")
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我找不到类似的东西来获取每个StorageVolume实例的总空间。假设我对此是正确的,我已经在这里提出了要求。
您可以在我对此问题写的答案中找到更多我所找到的内容,但是目前,这是所有变通办法的结合,这些工作不是变通办法,而是在某些情况下有效。 …
在使用Android O之前,为了获得应用程序的大小,您必须具有特殊的权限,并使用隐藏的API。
这样的解决方案不再起作用,但是Google提供了一个不太细粒度的官方API:queryStatsForPackage,它返回StorageStats对象。
但是,我找不到有关如何使用它的任何信息。
与仅需要应用程序包名称的隐藏API相比,该API还需要“ String volumeUuid”和“ UserHandle user”。