Android 6中的存储访问方式发生了哪些变化?

48

背景

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卡的能力,所以仍然无法知道发生了什么。

问题

  1. 将使用File-API而不是DocumentFile来访问SD卡吗?

  2. 如果我想要访问所有外部存储路径(包括SD卡),这是否意味着我需要请求两次权限:一次是主要外部存储,另一次是SD卡?

  3. 在手动授予权限之前,SD卡上的文件是否以任何方式可访问?

  4. 假设用户选择使用“采纳式存储设备”,对于检索应用程序文件路径的各种函数,例如getFilesDir、getExternalFilesDir等,会发生什么?它们的顺序是否会因此而改变?

  5. 当用户将应用程序从/到SD卡移动(使用“采纳式存储设备”)时,应用程序的文件会发生什么?SD卡上的应用程序文件会怎样?它们会保留还是会移动到其他地方?

    例如,如果应用程序在SD卡上有“file1.txt”,路径为“/storage/extSdCard/Android/data/appPackageName”,并且在主要外部存储上的路径为“/storage/emulated/0/Android/data/appPackageName”下有一个文件“file2.txt”(甚至是同一名称)。切换后,这些文件会发生什么?如果它们可以合并到一个文件夹中,它们会如何合并?

  6. 将应用程序移动到SD卡(使用“采纳式存储设备”)是否意味着不再使用内部存储?


2
由于目前市面上没有搭载SD卡的Android 6设备,而且模拟器本身也无法使用SD卡,因此仍然无法确定具体情况。引用您提供的文档:“要在开发者预览版中调试此功能,您可以启用通过USB On-The-Go(OTG)电缆连接到Android设备的USB驱动器的采用”。在MNCv1上运行良好。 - CommonsWare
1
当用户使用“可采用的存储设备”将应用程序从/移动到SD卡时,应用程序的文件会发生什么情况?-- 内部存储(例如getFilesDir())将移动到采用的存储中。除非文档和我的实验遗漏了某些内容,否则外部存储上的文件不会发生任何变化。“SD卡上的应用程序文件怎么样?”-- 采用的存储将被重新格式化并转换为加密卷;在采用过程中,其中的任何内容都将被抹掉。 - CommonsWare
关于模拟器,我知道这一点,但它并不像真正的SD卡那样被视为主要的外部存储。在模拟器上,你只能有一个外部存储。这种情况现在非常非常罕见。我所知道的所有设备都有内部和外部存储。没有只有内部和SD卡的设备,就像模拟器上的设置一样。事实上,你不能将SD卡设置为0MB,因为它是主要的外部存储。 - android developer
关于“可采用的存储设备”,这是否意味着一旦完成后就无法在内部存储上存储任何内容?我还假设该应用程序现在存储在SD卡的不同分区中,对吗?一个没有应用程序可以读取的分区。 - android developer
对于单个应用程序,据我所知,是的。与旧版Android 2.x时代的“apps2SD”类似,用户可以在内部存储器上安装一些应用程序,并将另一些应用程序安装在可移动存储器上。正如我所写的那样,采用的存储将被重新格式化并转换为加密卷。我没有关于更细粒度安全性的详细信息,但我认为它与应用程序访问其他应用程序的内容方面等同于内部存储。 - CommonsWare
显示剩余4条评论
2个回答

10
  • Are there any limitations to using "Adoptable Storage Devices"?
  • Yes, there are limitations to using "Adoptable Storage Devices". Some devices may not support it and some apps may not work properly with it. Additionally, the speed of the SD card may affect the overall performance of the device.

  • 当将应用程序移动到SD卡(使用“可采纳的存储设备”)时,这是否意味着不会使用内部存储?
  • 是的,原始的内部存储将不会被使用。只有选择SD卡作为“可采纳的存储设备”后,所有数据/缓存才会存储到SD卡中。


    1
    同样地,如果我将SD卡设置为内部存储,但我决定在实际内部存储上安装应用程序,那么我能否使用SD卡来存储应用程序数据?如果可以,那么我应该使用哪个API呢?我知道getExternalFilesDir在这种情况下不会返回任何路径。 - nalitzis

    1
    回答您的第五个问题:在Android 7下,“公共数据”区域中的所有文件,即/storage/emulated/0/(或制造商特定位置;它是包含DCIM Downloads等的目录),要么完全存储在内部存储器中,要么完全存储在采用的SD卡上。在采用SD卡的初始格式化之后,用户将有机会“迁移数据”,这将移动所有的/storage/emulated/0到SD卡。用户还可以随时进入设置/存储,选择当前未持有公共数据区域的存储区域,并点击右上角的(三个垂直点)图标以打开菜单,其中包含“迁移数据”选项。
    似乎没有办法让用户或应用程序在使用采用的卡时强制将特定的公共文件存储到SD卡中;这是全盘的。 (应用程序的私有存储将基于应用程序是否已移动到SD卡而位于内部存储器或SD卡上;在那里,似乎应用程序只会使用其中一个,而不是两者都使用。)

    第5点提到的文件会发生什么?有人说它们将被格式化。这是真的吗?另外,您说这是全盘移动。这意味着所有应用程序及其数据都将移动到SD卡中?那么内部存储器还剩下什么可以存储的?只有系统应用程序及其数据,也许?如果用户拔出SD卡会发生什么? - android developer
    我不是完全清楚你的问题。如果你格式化了一个带有文件的SD卡,那么这些文件就会消失。如果你只是取出旧卡并用新卡替换它,那么文件仍然在旧卡上,但无法被你的手机访问。或者你找到了一种在设备中放置两个SD卡的方法吗? - cjs

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接