Как изменить доступ к хранилищу на Android 6?

Фон

У 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-карте, вам нужно попросить у пользователя разрешения и использовать API DocumentFile вместо File API. Это вызвало множество вопросов, поскольку я писал о здесь, здесь и здесь.

Начиная с API 23 (Android 6), похоже, что все снова меняется...

Проблема

Для API 23 есть как минимум 2 вещи, которые новы и связаны с памятью:

Так как у Android нет устройства с SD-картой, и поскольку сам эмулятор действительно не имеет возможности использовать SD-карту, все еще невозможно узнать, что происходит.

Вопросы

  • Будет ли SD-карта получить доступ с использованием File-API вместо DocumentFile?

  • Если мне нужен доступ ко всем внешним путям хранения (включая SD-карту), значит ли это, что мне нужно дважды запрашивать эти разрешения: один для основного внешнего хранилища и один для SD-карты?

  • Доступны ли файлы на SD-карте каким-либо образом до предоставления разрешения на использование вручную?

  • Предположим, что пользователь решил использовать "Adoptable Storage Devices" , что это означает для различных функций, которые извлекают пути к файлам приложений? Например: getFilesDir, getExternalFilesDir,...? Из-за этого изменилось бы другое из getExternalFilesDirs?

  • Что происходит с файлами приложения, когда пользователь перемещает приложение с/на SD-карту (используя "Adoptable Storage Devices" )? Как насчет файлов приложений на SD-карте? Останутся ли они? Или они куда-нибудь переместятся?

    Например, если приложение имеет файл "file1.txt" на SD-карте, на пути "/storage/extSdCard/Android/data/appPackageName", и у него есть файл "file2.txt" (или даже одно и то же имя) на основном внешнем хранилище по пути "/storage/emulated/0/Android/data/appPackageName". После переключения, что произойдет для этих файлов? Как бы они слились в одну папку, если вообще?

  • При перемещении приложения на SD-карту (используя "Adoptable Storage Devices" ) означает ли это, что внутреннее хранилище не будет использоваться?

Ответ 1

Позвольте мне ответить на Удостоверяемые устройства хранения:

  1. Предположим, что пользователь решил использовать "Adoptable Storage Devices" , что это означает для различных функций, которые извлекают пути файлы приложений? Например: getFilesDir, getExternalFilesDir,...? Из-за этого изменится другой из getExternalFilesDirs?

Когда пользователь выбирает использовать SD-карту как "Adoptable Storage Device" (формат как внутренний), теперь это означает, что SD-карта доступна только в качестве внутреннего хранилища, то есть нет SD-карты, доступной для хранения загруженных файлов. Изменения путей в путях, возвращаемых связанными методами, не будут. Например: getExternalFilesDir() будет отображать только внешний путь хранения, если пользователь отформатировал свою SD-карту как "Adoptable Storage Devices" . Путь к карте SD не будет доступен.

  1. Что происходит с файлами приложения, когда пользователь перемещает приложение с/на SD-карту (используя "Adoptable Storage Devices" )? Какие о файлах приложений на SD-карте? Останутся ли они? Или они двигаться где-то? Например, если приложение имеет файл "file1.txt" на SD-карта, по пути "/storage/extSdCard/Android/data/appPackageName", и он имеет файл "file2.txt" (или даже одно и то же имя) на первичном внешнее хранилище на пути "/Хранение/эмулировать/0/Android/данные/appPackageName". После переключения, что будет с этими файлами? Как они слились бы в один папка, если вообще?

Когда пользователь выбирает свою SD-карту в качестве "Adoptable Storage Devices" , пользователю необходимо отформатировать SD-карту как внутреннее хранилище, используя "Формат как внутренний" . Формат означает, что все данные/файлы, хранящиеся на SD-карте, будут удалены. Аналогично, когда пользователь хочет удалить свою SD-карту из "Adoptable Storage Devices" , пользователю снова нужно отформатировать свою SD-карту в качестве переносного хранилища, используя опцию "Формат как переносная" .

  1. При перемещении приложения на SD-карту (используя "Adoptable Storage Devices" ) означает ли это, что внутренняя память не будет использоваться?

Да, исходное внутреннее хранилище не будет использоваться. Будет использоваться только хранилище SD-карт, поскольку после выбора SD-карты в качестве "Adoptable Storage Devices" . Все данные/кеш будут сохранены на SD-карте.