Android 6上的存储访问如何变化?

and*_*per 47 android sd-card android-permissions android-external-storage android-6.0-marshmallow

背景

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.正如我在这里,这里这里所写的那样,这引发了许多问题.

从API 23(Android 6)开始,事情似乎再次发生变化......

问题

对于API 23,至少有两件新东西与存储相关:

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

由于没有配备SD卡的Android 6设备,并且因为模拟器本身并不能真正使用SD卡,所以仍然无法知道发生了什么.

问题

  1. SD卡是否可以使用File-API而不是DocumentFile获取访问权限?

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

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

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

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

    例如,如果应用程序在SD卡上有"file1.txt",则在路径"/ storage/extSdCard/Android/data/appPackageName"上,它有一个文件"file2.txt"(或者甚至是同一个名字)在路径"/ storage/emulated/0/Android/data/appPackageName"上的主外部存储上.切换后,这些文件会发生什么?如果有的话,他们将如何合并到一个文件夹中?

  6. 将应用程序移动到SD卡(使用"Adoptable Storage Devices")时,是否意味着不会使用内部存储?

Vik*_*ngh 10

让我回答Adoptable存储设备相关问题:

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

当用户选择将SD卡用作"可采用的存储设备"(格式为内部)时,表示SD卡现在仅可用作内部存储,即没有SD卡可用于存储下载的文件.相关方法返回的路径中不会更改订单.例如:如果用户将其SD卡格式化为"Adoptable Storage Devices",则getExternalFilesDir()将仅列出外部存储路径.SD卡路径将不可用.

  1. 当用户将应用程序从SD卡移动到SD卡时(使用"可采用的存储设备"),应用程序的文件会发生什么变化?SD卡上的应用程序文件怎么样?他们会留下来吗?或者他们会搬到某个地方?例如,如果应用程序在SD卡上有"file1.txt",则在路径"/ storage/extSdCard/Android/data/appPackageName"上,它有一个文件"file2.txt"(或者甚至是同一个名字)在路径"/ storage/emulated/0/Android/data/appPackageName"上的主外部存储上.切换后,这些文件会发生什么?如果有的话,他们将如何合并到一个文件夹中?

当用户将SD卡选为"Adoptable Storage Devices"时,用户需要使用"Format as internal"选项将其SD卡格式化为内部存储.格式表示存储在SD卡上的所有数据/文件都将被删除.类似地,当用户想要从"可采用的存储设备"中移除他的SD卡时,用户再次必须使用"作为便携式格式"选项将他的SD卡格式化为便携式存储器.

  1. 将应用程序移动到SD卡(使用"Adoptable Storage Devices")时,是否意味着不会使用内部存储?

是的,不会使用原始内部存储空间.在选择SD卡作为"Adoptable Storage Devices"之后,将仅使用SD卡存储.所有数据/缓存都将存储到SD卡中