如何在 Android12 中导航外部存储文件系统?

How do I navigate the external storage file system in Android 12?

我想制作一个面向 API 级别 31 的文件管理器应用程序,它需要访问设备上的所有文件。为此,我遵循了此处的指导:https://developer.android.com/training/data-storage/manage-all-files.

我已添加 MANAGE_EXTERNAL_STORAGE 权限并在设备设置中允许。这是我用来列出设备根目录的 Kotlin 代码:

val file = Environment.getStorageDirectory()

// ensure we have file access permission
if (Environment.isExternalStorageManager() && Environment.isExternalStorageManager(file)) {
    Log.d("FileManager", "Exists: ${file.exists()}")
    Log.d("FileManager", "Is directory: ${file.isDirectory}")
    Log.d("FileManager", "List files: ${file.listFiles()}")
}

这是输出:

D/FileManager: Exists: true
D/FileManager: Is directory: true
D/FileManager: List files: null

如您所见,该目录存在,但listFiles()意外returnsnull。鉴于此,我如何从根目录开始浏览设备上的所有文件?

我看过类似的问题,但他们的答案似乎都过时或无法使用。以下是我发现的一些建议:

Given this, how can I navigate all the files on the device, starting from the root directory?

你不能,至少在无根设备上。即使使用 MANAGE_EXTERNAL_STORAGE,您也只能访问外部存储,而不是整个设备文件系统。

Use Environment.getExternalStorageDirectory() — This works, but is deprecated in API level 31.

It is now undeprecated,截至 Android 12L 和 Android 13 DP2。希望 public 文档将在今年晚些时候 Android 13 发布时反映这一点。

Use android:requestLegacyExternalStorage="true" — This is outdated.

你还想要 Android 10 支持。

向清单文件添加使用权限 MANAGE_EXTERNAL_STORAGE 不足以获得 'all files access'。

您还必须在运行时启动 Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION 的意图。