背景
Android在处理SD卡和存储方面进行了许多更改:
- API 3 - 您可以获得所有权限,无需权限。
- API 4-15 - 您需要使用WRITE_EXTERNAL_STORAGE,并获得所有权限。
- API 16-18 - 如果您只想读取,请使用READ_EXTERNAL_STORAGE
- API 19-20 - 除非您的应用是系统应用程序或您具有root,否则无法读取或写入辅助外部存储(SD卡)。
- 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卡的能力,所以仍然无法知道发生了什么。
问题
将使用File-API而不是DocumentFile来访问SD卡吗?
如果我想要访问所有外部存储路径(包括SD卡),这是否意味着我需要请求两次权限:一次是主要外部存储,另一次是SD卡?
在手动授予权限之前,SD卡上的文件是否以任何方式可访问?
假设用户选择使用“采纳式存储设备”,对于检索应用程序文件路径的各种函数,例如getFilesDir、getExternalFilesDir等,会发生什么?它们的顺序是否会因此而改变?
当用户将应用程序从/到SD卡移动(使用“采纳式存储设备”)时,应用程序的文件会发生什么?SD卡上的应用程序文件会怎样?它们会保留还是会移动到其他地方?
例如,如果应用程序在SD卡上有“file1.txt”,路径为“/storage/extSdCard/Android/data/appPackageName”,并且在主要外部存储上的路径为“/storage/emulated/0/Android/data/appPackageName”下有一个文件“file2.txt”(甚至是同一名称)。切换后,这些文件会发生什么?如果它们可以合并到一个文件夹中,它们会如何合并?
将应用程序移动到SD卡(使用“采纳式存储设备”)是否意味着不再使用内部存储?
getFilesDir()
)将移动到采用的存储中。除非文档和我的实验遗漏了某些内容,否则外部存储上的文件不会发生任何变化。“SD卡上的应用程序文件怎么样?”-- 采用的存储将被重新格式化并转换为加密卷;在采用过程中,其中的任何内容都将被抹掉。 - CommonsWare