Как меняется доступ к хранилищу на 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. Это вызвало много вопросов, поскольку я писал о здесь, здесь и < strong> здесь.

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

Эта проблема

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

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

Вопросы

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

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

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

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

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

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

  6. Означает ли это, что при перемещении приложения на SD-карту (с помощью «Adoptable Storage Devices») внутреннее хранилище не будет использоваться?


person android developer    schedule 20.08.2015    source источник
comment
Поскольку нет устройства Android 6 с SD-картой, и поскольку сам эмулятор действительно не имеет возможности использовать SD-карту, по-прежнему невозможно узнать, что происходит, - цитируя документацию, которую вы связали. Чтобы отладить эту функцию в предварительной версии для разработчиков, вы можете включить использование USB-накопителя, подключенного к устройству Android с помощью кабеля USB On-The-Go (OTG). Работал нормально на MNCv1.   -  person CommonsWare    schedule 21.08.2015
comment
Что происходит с файлами приложения, когда пользователь перемещает приложение с / на SD-карту (с помощью Adoptable Storage Devices)? - внутреннее хранилище (например, getFilesDir()) переместится в принятое хранилище. Файлы на внешнем хранилище не меняются, если только в документации и моих экспериментах что-то не пропущено. А как насчет файлов приложения на SD-карте? - принятое хранилище переформатируется и превращается в зашифрованный том; все, что на нем, стирается в процессе усыновления.   -  person CommonsWare    schedule 21.08.2015
comment
Про эмулятор я знаю, но он не похож на настоящую SD-карту, так как считается основным внешним хранилищем. В эмуляторе может быть только одно внешнее хранилище. В наши дни такая ситуация очень редка. Все устройства, о которых я знаю, имеют как внутреннее, так и внешнее хранилище. Ни у кого есть только внутренняя и SD-карта, как это сделано на эмуляторе. Фактически, вы не можете установить 0 МБ для SD-карты только потому, что это основное внешнее хранилище.   -  person android developer    schedule 21.08.2015
comment
Что касается Adoptable Storage Devices, означает ли это, что после того, как это будет сделано, во внутреннем хранилище ничего нельзя будет сохранить? Я также предполагаю, что приложение теперь хранится на другом разделе SD-карты, верно? Тот, из которого ни одно приложение не может читать.   -  person android developer    schedule 21.08.2015
comment
Означает ли это, что после того, как это будет сделано, во внутреннем хранилище ничего нельзя будет сохранить? - для отдельного приложения, AFAIK, да. Как и в случае со старыми приложениями эпохи Android 2.x2SD, пользователи могут иметь некоторые приложения во внутренней памяти, а некоторые - на съемном. Я также предполагаю, что приложение теперь хранится на другом разделе SD-карты, верно? - как я уже писал, принятое хранилище переформатируется и превращается в зашифрованный том. У меня нет подробностей о более детальной безопасности, чем это, хотя я предполагаю, что это эквивалентно внутреннему хранилищу в отношении приложений, получающих доступ к материалам других приложений.   -  person CommonsWare    schedule 21.08.2015
comment
Означает ли это, что после того, как это будет сделано, во внутреннем хранилище ничего нельзя будет сохранить? - однако все API (например, getFilesDir()) по-прежнему работают. Они просто указывают на другое место. В этом отношении это похоже на вторичные учетные записи, которые у нас были с Android 4.2. И именно поэтому я стараюсь убедить разработчиков прекратить жесткое программирование.   -  person CommonsWare    schedule 21.08.2015
comment
Имеет смысл. Пожалуйста, попробуйте ответить на остальные вопросы. Кроме того, почему вы все это пишете в комментариях?   -  person android developer    schedule 21.08.2015
comment
@VicJordan Я не знаю. Я думаю, это похоже на то, но не все вопросы связаны с Adoptable Storage Devices.   -  person android developer    schedule 25.08.2015
comment
К вашему сведению, Sony Xperia получит обновления Android 6, а CM13 отлично работает (намного лучше, чем 12.x) на моем S5.   -  person Evan Carroll    schedule 30.12.2015


Ответы (2)


Позвольте мне ответить на вопросы, связанные с адаптируемыми запоминающими устройствами:

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

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

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

Когда пользователь выберет свою SD-карту в качестве «Приспосабливаемые устройства хранения», ему необходимо отформатировать свою SD-карту как внутреннее хранилище, используя параметр «Форматировать как внутреннее». Форматирование означает, что все данные / файлы, хранящиеся на SD-карте, будут удалены. Точно так же, когда пользователь хочет удалить свою SD-карту из «Приспосабливаемых запоминающих устройств», пользователь снова должен отформатировать свою SD-карту как портативное хранилище, используя параметр «Форматировать как портативное».

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

Да, исходное внутреннее хранилище использоваться не будет. Будет использоваться только хранилище SD-карты, потому что после выбора SD-карты в качестве «Допустимые устройства хранения». Все данные / кеш будут храниться на SD-карте.

person Vikasdeep Singh    schedule 26.08.2015
comment
Точно так же, если у меня есть SD-карта в качестве внутреннего хранилища, но я решаю установить приложение в реальном внутреннем хранилище, смогу ли я использовать SD-карту для хранения данных приложения? И если да, то какой API мне следует использовать, поскольку я понимаю, что getExternalFilesDir в этом случае не вернет никакого пути? - person nalitzis; 28.10.2015

Чтобы ответить на ваш вопрос 5: в Android 7 все файлы в области «общедоступных данных», /storage/emulated/0/ (или в определенном производителем месте; это каталог, содержащий DCIM Downloads и т. Д.), Хранятся либо полностью во внутренней памяти, либо полностью на принятой SD-карте. После первоначального форматирования принятой SD-карты пользователю будет представлена ​​возможность «Перенести данные», в результате чего все /storage/emulated/0 будут перемещены на SD-карту. В любое время пользователь также может перейти в Настройки / Хранилище, выбрать область хранилища, которая в настоящее время не содержит области общедоступных данных, и щелкнуть значок (три вертикальные точки) в правом верхнем углу. чтобы открыть меню с опцией «Перенести данные».

Похоже, что у пользователя или приложения нет способа принудительно записать конкретный общедоступный файл на SD-карту, если используется адаптированная карта; это все или ничего. (Личное хранилище приложения будет во внутреннем хранилище или на SD-карте, в зависимости от того, было ли приложение перемещено на SD-карту; также кажется, что приложение будет использовать только одно или другое, а не оба .)

person cjs    schedule 10.09.2018
comment
Что будет с файлами, которые я упомянул в №5? Было сказано, что он будет отформатирован. Это правда? Кроме того, вы сказали, что все или ничего. Это значит, что все приложения и их данные будут перенесены на sd-карту? Что осталось хранить во внутренней памяти? Возможно, просто системное приложение и их данные? А что будет, если пользователь вытащит sd-карту? - person android developer; 10.09.2018
comment
Я не совсем понимаю, о чем вы спрашиваете. Если вы отформатируете SD-карту с файлами на ней, эти файлы исчезнут, да. Если вы просто извлечете старую карту и замените ее новой, файлы останутся на старой карте, но будут недоступны для вашего телефона. Или вы как-то нашли способ вставить в устройство две SD-карты? - person cjs; 11.09.2018