Выберите каталог / файл с помощью Intent.ACTION_CREATE_DOCUMENT (Storage Access Framework)

Как объясняется здесь:

http://www.doubleencore.com/2014/03/android-external-storage/

Или здесь:

http://www.androidpolice.com/2014/02/17/external-blues-google-has-brought-big-changes-to-sd-cards-in-kitkat-and-even-samsung-may-be- -исполнителей им /

KitKat ограничивает запись вторичного внешнего хранилища в каталог, специфичный для пакета (хотя некоторые разработчики уже нашли обходное решение …). С Samsung, использующей SD-карту в качестве вторичного внешнего хранилища и развертывания, это обновление 4.4.2, это стало серьезной проблемой для многих приложений.

Мое приложение имеет функцию сохранения как функцию, которая позволяет пользователю выбрать произвольный каталог для сохранения файла. Я использую Intents, такие как org.openintents.action.PICK_DIRECTORY, com.estrongs.action.PICK_DIRECTORY или мой встроенный проводник файлов, чтобы выбрать каталог. Пользователь, конечно же, может свободно выбирать любой путь на SD-карте, но из-за новых ограничений с KitKat фактическая операция хранилища завершается с ошибкой, если каталог один, у моего приложения нет доступа для записи.

Мне нужен альтернативный способ выбрать каталог в KitKat, чтобы пользователь не получал сообщение об ошибке, когда он пытается сохранить SD-карту. Этого можно добиться, разрешив им выбирать только каталоги, к которым приложение имеет доступ на запись.

Я попытался использовать Intent.ACTION_CREATE_DOCUMENT следующим образом:

Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType(attachment.getContentType()) .putExtra(Intent.EXTRA_TITLE, attachment.getName()); startActivityForResult(intent, RequestCodes.MSG_CHOOSE_DIRECTORY); 

Это отлично работает, и я могу написать файл, который выбрал пользователь, но я могу выбрать только определенные каталоги. Например, для файла в формате pdf он вернет каталог загрузки (соответствующий Environment.DIRECTORY_DOWNLOADS), для jpg он позволит мне выбрать каталог загрузки и диск (ы) Google. Однако он не дает мне возможность выбирать другие папки на основном внешнем хранилище, а не на конкретном каталоге пакетов на SD-карте (я пробовал разные типы контента, такие как «* / *» или DocumentsContract.Document.MIME_TYPE_DIR, но безрезультатно).

Так что я ищу, чтобы позволить пользователю выбрать каталог в основной внешней файловой системе (как это было в файле Environment.getExternalStorageDirectory (), который на самом деле является внутренним хранилищем), а также все каталоги, которые инфраструктура предоставит мне доступ Во вторичном внешнем хранилище, чтобы сохранить файл в этом каталоге. Независимо от того, выбирает ли пользователь каталог или файл, приложение будет использовать либо собственное имя файла, либо имя пользователя.

Альтернативно, знание того, как определенные приложения нашли способ преодоления новых ограничений на запись, конечно же, было бы жизнеспособным вариантом ;-). ES File Explorer, например, может записывать любой файл в любой каталог на SD-карте, как я могу подтвердить из моих собственных тестов на непереработанном S4 с sdcard.

Solutions Collecting From Web of "Выберите каталог / файл с помощью Intent.ACTION_CREATE_DOCUMENT (Storage Access Framework)"

Как поясняется в этой подробной статье , если вы запрашиваете android.permission.WRITE_EXTERNAL_STORAGE тогда

Разрешения первичного внешнего хранилища не изменились; Они ведут себя одинаково в 4.4, как и раньше.

Это только вторичное внешнее хранилище, на которое влияют изменения в KitKat – единственный каталог, к которому у вас есть доступ к вторичному внешнему хранилищу, предназначен для вашего приложения. Они также отмечают, что на устройствах Samsung SD-карта считается вторичным внешним хранилищем.

Вы пробовали MIME_TYPE_DIR ?

 intent.setType(DocumentsContract.Document.MIME_TYPE_DIR);//For API 19+ 

Изменить: поставщик документов

Чтобы увидеть внешнее хранилище в DocumentUI (например, диалог выбора файлов), вам нужно включить «Показывать расширенные устройства» в настройках DocumentUI.

Это пользовательский параметр, поэтому пользователь может изменять его вручную.