如何使用 android 范围/共享存储获取可用空间?

Posted

技术标签:

【中文标题】如何使用 android 范围/共享存储获取可用空间?【英文标题】:How do I get the available space using android scoped/shared storage? 【发布时间】:2021-12-18 01:09:33 【问题描述】:

在我的应用中,系统会提示用户使用意图 ACTION_CREATE_DOCUMENT 创建一个 zip 文件(如 here)

这会返回我的应用的内容 URI,类似于:content:/com.android.externalstorage.documents/document/primary%3ADocuments%2Fbackup.zip

这是用户选择位置后我的应用将写入的备份文件。我需要检查所选位置是否有足够的空间存放文件,因为文件可能会变得非常大,超过 1GB。

问题是,我找不到合适的标准化方法来检查我要写入文件的字节数是否适合用户选择的文件夹的可用空间。许多旧方法都行不通,因为我无法直接访问文件系统。

我尝试了文档中的this 解决方案,但它似乎只处理应用程序私有、范围存储中的文件。

StorageManagerStorageStatsManager 似乎也不起作用,因为它们似乎无法理解 content-uris,而只能理解我无法使用的标准 Java-File 对象。

如何简单检查可用空间?

【问题讨论】:

请注意,ACTION_CREATE_DOCUMENT 不限于文件系统。它可以包括网络服务器、云存储服务等。 感谢您的信息,但我知道,如果有足够的空间,创建和写入 zip 文件不会导致任何问题。 但是,“空间足够”并不一定容易回答,这就是为什么 AFAIK 它不是存储访问框架协议的一部分。 【参考方案1】:

如果您在内容方案中看到 /primary,则说明您使用的是设备存储。如果不是来自可移动 micro sd 卡。

您可以使用文件parhs以老式方式确定存储空间和存储可用空间。

查看 getExternalFilesDirs() 返回的路径。

【讨论】:

【参考方案2】:

通过使用SimpleStorage,无需任何许可即可检索主(外部)存储的可用容量:

val freeBytesOfPrimary = DocumentFileCompat.getFreeSpace(context, StorageId.PRIMARY)

val freeBytesOfSdCard = DocumentFileCompat.getFreeSpace(context, "9016-4EF8")

【讨论】:

以上是关于如何使用 android 范围/共享存储获取可用空间?的主要内容,如果未能解决你的问题,请参考以下文章

如何android多Activity间共享数据

获取 Android 上的所有总空间和可用空间

如何获取联系人可用的最大内存

如何使用范围存储创建和删除公共文件,Android Q

如何将用户的GPS位置与可用的GPS位置进行比较?

获取空工作表中的列范围