【发布时间】:2015-11-14 18:32:39
【问题描述】:
背景
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。这引发了很多问题,正如我所写的 here、here 和 here。
从 API 23 (Android 6) 开始,事情似乎又发生了变化……
问题
对于 API 23,至少有 2 项新内容与存储相关:
- "Adoptable Storage Devices" - 用户可以选择将 SD 卡作为主要外部存储设备。
- 作为new permissions mechanism(在运行时请求权限)的一部分,似乎存储也是用户需要确认的权限。这适用于 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE
由于目前还没有配备 SD 卡的 Android 6 设备,而且模拟器本身并不能真正使用 SD 卡,因此仍然无法知道发生了什么。
问题
SD 卡是否会使用 File-API 而不是 DocumentFile 获得访问权限?
如果我想访问所有外部存储路径(包括 SD 卡),这是否意味着我需要两次请求此权限:一次用于主外部存储,一次用于 SD 卡?
在手动授予权限之前,是否可以通过任何方式访问 SD 卡上的文件?
假设用户选择使用“可采用的存储设备”,这对于检索应用程序文件路径的各种功能意味着什么?例如:getFilesDir、getExternalFilesDir、...? getExternalFilesDirs 的顺序会不会因此而改变?
-
当用户将应用移出/移入 SD 卡(使用“可采用的存储设备”)时,应用的文件会发生什么情况? SD卡上的应用程序文件呢?他们会留下来吗?还是他们会搬到某个地方?
例如,如果应用在 SD 卡上的路径“/storage/extSdCard/Android/data/appPackageName”上有“file1.txt”,并且它有一个文件“file2.txt”(甚至同名)在路径“/storage/emulated/0/Android/data/appPackageName”的主外部存储上。切换后,这些文件会发生什么?如果有的话,它们将如何合并到一个文件夹中?
将应用移至 SD 卡(使用“可采用的存储设备”)时,是否意味着不会使用内部存储?
【问题讨论】:
-
"由于没有带有 SD 卡的 Android 6 设备,而且模拟器本身并没有真正使用 SD 卡的能力,所以仍然无法知道发生了什么on" -- 引用您链接到的文档,“要在开发人员预览版中调试此功能,您可以启用通过 USB On-The-Go (OTG) 电缆连接到 Android 设备的 USB 驱动器” .在 MNCv1 上运行良好。
-
“当用户将应用程序从/移到 SD 卡(使用“可采用的存储设备”)时,应用程序的文件会发生什么? -- 内部存储(例如,
getFilesDir())将移至采用的存储。外部存储上的文件没有变化,除非文档和我的实验遗漏了一些东西。 “SD卡上的应用程序文件呢?” -- 采用的存储被重新格式化并变成加密卷;作为收养过程的一部分,上面的任何内容都会被删除。 -
关于模拟器,我知道,但它不像真正的 SD 卡,因为它被认为是主要的外部存储。模拟器上只能有一个外部存储。这种情况在当今非常非常罕见。我所知道的所有设备都有内部和外部存储。没有一个只有内部和 SD 卡,就像在模拟器上所做的那样。事实上,您不能将 SD 卡设置为 0MB,因为它是主要的外部存储。
-
关于“可采用的存储设备”,是否意味着一旦完成,内部存储就不能存储任何内容?我还假设该应用程序现在存储在 SD 卡的不同分区上,对吗?任何应用都无法读取的内容。
-
"这是否意味着一旦完成,内部存储就不能存储任何内容?" - 对于单个应用程序,AFAIK,是的。与旧的 Android 2.x 时代“apps2SD”的东西一样,用户可以在内部存储上拥有一些应用程序,而在可移动存储上拥有一些应用程序。 “我还假设应用程序现在存储在 SD 卡的不同分区上,对吧?” ——正如我所写,采用的存储被重新格式化并变成了加密卷。我没有比这更细粒度的安全性的详细信息,尽管我认为就应用获取其他应用的内容而言,它相当于内部存储。
标签: android sd-card android-permissions android-external-storage android-6.0-marshmallow