Android 6 上的存储访问权限有何变化?

Posted

技术标签:

【中文标题】Android 6 上的存储访问权限有何变化?【英文标题】:How does storage access change on Android 6? 【发布时间】: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。这引发了很多问题,正如我所写的 hereherehere

从 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 卡的不同分区上,对吧?” ——正如我所写,采用的存储被重新格式化并变成了加密卷。我没有比这更细粒度的安全性的详细信息,尽管我认为就应用获取其他应用的内容而言,它相当于内部存储。 【参考方案1】:

让我回答可采用的存储设备相关问题:

    假设用户选择使用“Adoptable Storage Devices”,这对于检索路径的各种函数意味着什么? 应用程序的文件?例如:getFilesDir、getExternalFilesDir、...? getExternalFilesDirs 的顺序会因此而改变吗?

当用户选择使用 SD 卡作为“可采用的存储设备”(格式为内部)时,这意味着现在 SD 卡只能用作内部存储,即没有 SD 卡可用于存储下载的文件。相关方法返回的路径不会有顺序变化。例如:如果用户将其 SD 卡格式化为“可采用的存储设备”,则 getExternalFilesDir() 将仅列出外部存储路径。 SD 卡路径将不可用。

    当用户将应用程序移出/移入 SD 卡(使用“可采用的存储设备”)时,应用程序的文件会发生什么情况?什么 关于 SD 卡上的应用程序文件?他们会留下来吗?或者他们会 搬到某个地方?例如,如果应用在 SD 卡,在路径“/storage/extSdCard/Android/data/appPackageName”上,以及 它在主数据库上有一个文件“file2.txt”(甚至同名) 路径上的外部存储 “/storage/emulated/0/Android/data/appPackageName”。切换后, 这些文件会发生什么?他们将如何合并成一个单一的 文件夹,如果有的话?

当用户选择他的 SD 卡作为“可采用的存储设备”时,用户需要使用 “格式化为内部” 选项将他的 SD 卡格式化为内部存储。格式化意味着存储在 SD 卡上的所有数据/文件都将被删除。同样,当用户想要从“可采用的存储设备”中移除他的 SD 卡时,用户必须再次使用 “格式化为便携式” 选项将他的 SD 卡格式化为便携式存储。

    将应用移至 SD 卡时(使用“可采用的存储设备”),是否意味着不会使用内部存储?

是的,原始内部存储将不会被使用。仅使用 SD 卡存储,因为选择 SD 卡作为“可采用的存储设备”后。所有数据/缓存都将存储到 SD 卡中

【讨论】:

同样,如果我有 SD 卡作为内部存储,但我决定将应用程序安装在真正的内部存储中,我可以使用 SD 卡存储应用程序数据吗?如果是,我应该使用哪个 API,因为我知道 getExternalFilesDir 在这种情况下不会返回任何路径?【参考方案2】:

回答您的问题 5:在 Android 7 下,“公共数据”区域 /storage/emulated/0/(或制造商特定位置;它是包含 DCIMDownloads 等的目录)中的所有文件都是要么完全存储在内部存储器中,要么完全存储在采用的 SD 卡上。在采用 SD 卡的初始格式后,用户将有机会“迁移数据”,这会将所有 /storage/emulated/0 移动到 SD 卡。用户也可以随时进入设置/存储,选择当前不保存公共数据区的存储区,然后点击下方的(三个垂直点)图标右上角会弹出一个带有“迁移数据”选项的菜单。

如果采用的卡正在使用中,用户或应用程序似乎无法将特定的公共文件强制存储到 SD 卡中;要么全有,要么全无。 (根据应用程序是否已移至 SD 卡,应用程序的私人存储将位于内部存储或 SD 卡上;似乎该应用程序只会使用其中一个,而不是同时使用两者.)

【讨论】:

我在 #5 中提到的文件会怎样?据说会被格式化。这是真的吗?另外,你说要么全有,要么全无。这意味着所有应用程序及其数据都将移至 sd 卡?现在还剩下什么供内部存储存储?也许只是系统应用程序及其数据?如果用户拔出 sd-card 会发生什么? 我不太清楚你在问什么。如果您格式化带有文件的 SD 卡,这些文件就消失了,是的。如果您只是取出旧卡并更换为新卡,文件仍在旧卡上,但您的手机无法访问。或者您是否找到了将两张 SD 卡放入设备的方法?

以上是关于Android 6 上的存储访问权限有何变化?的主要内容,如果未能解决你的问题,请参考以下文章

Android 6.0权限申请

android系统怎么设置内部存储的访问权限

应用程序如何在没有 root 的情况下访问 Android 6.0(API 级别 23)中 USB OTG 存储上的文件?

android系统怎样设置内部存储的访问权限

NTFS权限和共享权限有何区别

Android Q (10) 请求访问所有存储的权限。范围存储