背景
Android 在如何处理 SD 卡和存储方面有很多变化:
- API 3 - 您获得所有访问权限,无需权限
- API 4-15 - 您需要使用 WRITE_EXTERNAL_STORAGE,并且您可以获得所有访问权限。
- API 16-18 - 如果您只想阅读,请使用 READ_EXTERNAL_STORAGE
- API 19-20 - 您无法读取或写入辅助外部存储(SD 卡),除非您的应用程序是系统应用程序,或者您有 root。
- API 21-22 - 为了访问 SD 卡,您需要请求用户许可,并使用 DocumentFile API 而不是 File API。正如我在这里、这里和这里所写的那样,这引发了很多问题。
从 API 23 (Android 6) 开始,事情似乎又发生了变化……
问题
对于 API 23,至少有两件事是新的并且与存储相关:
- “可采用的存储设备” - 用户可以选择将 SD 卡设置为类似于主外部存储的东西。
- 作为新权限机制的一部分(在运行时请求权限),存储似乎也是用户需要确认的权限。这适用于 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE
由于没有带有 SD 卡的 Android 6 设备,并且由于模拟器本身并没有真正使用 SD 卡的能力,因此仍然不可能知道发生了什么。
问题
SD 卡会使用 File-API 而不是 DocumentFile 获得访问权限吗?
如果我想访问所有外部存储路径(包括 SD 卡),这是否意味着我需要两次请求此权限:一次用于主外部存储,一次用于 SD 卡?
在手动授予权限之前,是否可以通过任何方式访问 SD 卡上的文件?
假设用户选择使用“可采用的存储设备”,那么检索应用程序文件路径的各种功能意味着什么?例如:getFilesDir、getExternalFilesDir、...?getExternalFilesDirs 的顺序会因此而改变吗?
当用户将应用程序从/移到 SD 卡(使用“可采用的存储设备”)时,应用程序的文件会发生什么?SD卡上的应用程序文件呢?他们会留下来吗?或者他们会搬到某个地方吗?
例如,如果应用程序在 SD 卡上具有“file1.txt”,路径为“/storage/extSdCard/Android/data/appPackageName”,并且它有一个文件“file2.txt”(甚至同名)在路径“/storage/emulated/0/Android/data/appPackageName”上的主外部存储上。切换后,这些文件会发生什么?如果有的话,它们将如何合并到一个文件夹中?
将应用程序移动到 SD 卡(使用“可采用的存储设备”)时,是否意味着不会使用内部存储?