Android 6上的存储访问如何更改?

背景

关于如何处理SD卡和存储,Android有了很多变化:

  • 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,至less有两件新事物是与存储相关的:

  • 可采用的存储设备 ” – 用户可以select将SD卡作为主外部存储设备。
  • 作为新的权限机制 (在运行时请求权限)的一部分,似乎存储也是用户需要确认的权限。 这适用于READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE

由于没有安装SD卡的Android 6设备,而且由于模拟器本身并不具备使用SD卡的能力,所以仍然不可能知道发生了什么。

问题

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

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

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

  4. 假设用户select使用“可采用的存储设备”,这对于检索应用文件path的各种function意味着什么? 例如:getFilesDir,getExternalFilesDir,…? getExternalFilesDirs的oder会因为它而改变吗?

  5. 当用户将应用程序从SD卡上移动到SD卡时(使用“可采用的存储设备”),应用程序的文件会发生什么变化? 关于SD卡上的应用程序文件呢? 他们会留下吗? 或者他们会搬到什么地方?

    例如,如果应用程序在SD卡上具有“file1.txt”,则path为“/ storage / extSdCard / Android / data / appPackageName”,并且其具有文件“file2.txt”(甚至相同的名称)在path“/ storage / emulated / 0 / Android / data / appPackageName”上的主外部存储上。 切换后,这些文件会发生什么? 他们如何合并成一个单一的文件夹?

  6. 将应用程序移动到SD卡(使用“可采用的存储设备”)时,是否表示不使用内部存储器?

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

  1. 假设用户select使用“可采用的存储设备”,这对于检索应用文件path的各种function意味着什么? 例如:getFilesDir,getExternalFilesDir,…? getExternalFilesDirs的oder会因为它而改变吗?

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

  1. 当用户将应用程序从SD卡上移动到SD卡时(使用“可采用的存储设备”),应用程序的文件会发生什么变化? 关于SD卡上的应用程序文件呢? 他们会留下吗? 或者他们会搬到什么地方? 例如,如果应用程序在SD卡上具有“file1.txt”,则path为“/ storage / extSdCard / Android / data / appPackageName”,并且具有文件“file2.txt”(甚至是相同的名称)在path“/ storage / emulated / 0 / Android / data / appPackageName”上的主外部存储上。 切换之后,这些文件会发生什么? 他们如何合并成一个单一的文件夹?

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

  1. 将应用程序移至SD卡(使用“可采用的存储设备”)时,是否表示不使用内部存储器?

是的,原始的内部存储将不会被使用。 因为selectSD卡作为“可采用的存储设备”,将只使用SD卡存储。 所有的数据/caching将被存储到SD卡