如何在 Android 11 中获取目录文件列表

Але*_*нко 4 android

我想编写自己的 lite 文件浏览器。

File API 现在不适用于外部存储。

该版本还改进了作用域存储,这使开发人员可以更轻松地迁移到使用此存储模型。

我不明白如何使用作用域存储来访问 /sdcard。

Sid*_*ria 5

如果您正在寻找文件选择器体验,那么Storage Access Framework是您现在唯一的选择。下面的代码让你拿起多个文件。如果您想要目录级别选择,您可以使用ACTION_OPEN_DOCUMENT_TREE意图。

private fun openStorageAccess() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        type = "*/*"  
        addCategory(Intent.CATEGORY_OPENABLE)
        putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
    }
    startActivityForResult(intent, openDirectoryAccessCode)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == openDirectoryAccessCode && resultCode == Activity.RESULT_OK) {
        val fileUris = data?.clipData ?: data?.data
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,你可以要求一个特殊的所有文件访问,以MediaStore.Files从谷歌游戏控制台。有关Android 11 存储更改的更多信息。

编辑:

如果您想在 Android 29+ 中实现类似文件浏览器的体验,这里有一个建议的想法,我个人尚未尝试过但应该可行。这不会是最佳体验,但会非常类似于文件浏览器。

  1. 如果 API == 29,则使用常规文件 API(requestLegacyExternalStorage="true"如果 API == 29)。
  2. 如果 API > 29,则要求从 Google Play Console访问所有文件
    • MANAGE_EXTERNAL_STORAGE标志放入清单
    • 通过ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION有意打开设置提示用户允许所有文件访问。
    • 从查询中的所有文件MediaStore.Files连同RELATIVE_PATH
    • 相对路径 + 显示名称会给你类似DCIM/Vacation/IMG_1234.jpg.
    • 从所有相对路径中创建一棵树(更像森林)并将其显示在 UI 中。

  • `请求从 Google Play Console 访问所有文件`您不必询问 google。您只需为您的应用程序进行编程即可。当您拥有所有文件访问权限时,您可以像往常一样使用旧的 File api。 (2认同)

ist*_*tin 0

在Android 10及更高版本上,该API发生了很大变化,您可以查看官方文档或关注这篇文章