如何在 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
。鉴于此,我如何从根目录开始浏览设备上的所有文件?
我看过类似的问题,但他们的答案似乎都过时或无法使用。以下是我发现的一些建议:
- 使用
Environment.getExternalStorageDirectory()
- 这有效,但在 API 级别 31 中已弃用。
- 使用
android:requestLegacyExternalStorage="true"
- 这已经过时了。
- 使用
ActivityResultContracts
- 这不适用于自定义文件管理器应用程序。
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
的意图。
我想制作一个面向 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
。鉴于此,我如何从根目录开始浏览设备上的所有文件?
我看过类似的问题,但他们的答案似乎都过时或无法使用。以下是我发现的一些建议:
- 使用
Environment.getExternalStorageDirectory()
- 这有效,但在 API 级别 31 中已弃用。
- 使用
android:requestLegacyExternalStorage="true"
- 这已经过时了。
- 使用
ActivityResultContracts
- 这不适用于自定义文件管理器应用程序。
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
的意图。