Запись файлов в общедоступную папку документов в Android Q - Scoped Storage - PullRequest
3 голосов
/ 12 февраля 2020

Фон

После перехода на Android Я больше не могу найти подходящий способ получить доступ для записи в папку документов (/storage/emulated/0/Documents)

И прежде чем кто-либо упомянет о многих других вопросы по хранилищу с заданными областями, я прочитал многие из них, и из того, что я видел до сих пор, все решения используют каталог приложения c или доступ только к каталогу мультимедиа (не доступ к папке документов).

Из того, что я понимаю в Android QI можно выбрать:

  • Использовать каталог приложения c, который доступен только моему приложению (или приложениям, которые я предоставляю) разрешение)
  • Разрешить пользователю выбирать, где он хочет сохранить файл (я думаю, это может быть общедоступное c местоположение) ACTION_OPEN_DOCUMENT_TREE

Проблема

Приложения, которые я разрабатываю, используются для проведения тестов по предметам, данные тестов автоматически сохраняются в общедоступной папке «Документы», например: /storage/emulated/0/Documents/myAppName/subjectName/testData-todaysDate.pdf

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

Решение, которое я ищу

Так что решение, которое я ищу, должно быть в состоянии сделать следующее:

  • Не запрашивать разрешение несколько раз (один раз в порядке)
  • Автоматически сохраняет тестовые данные без запроса пользователя (так как будут проведены сотни тестов)
  • Сохраняет в папке c документы, например /storage/emulated/0/Documents/
  • Не требует выбора пользователем каталога, поэтому НЕ ACTION_OPEN_DOCUMENT_TREE
  • В идеале данные являются постоянными, поэтому удаление приложение не приводит к потере данных

Я понимаю, что эти изменения в Android Q призваны привлечь пользователей больше "в l oop" с тем, как приложения получают доступ к своим данным, но как только они понять, как ваше приложение использует ваши данные, проблем не должно быть.

Ответы [ 2 ]

6 голосов
/ 12 февраля 2020

Только для Android Q.

String collection = "content://media/1c11-2404/file"; // One can even write to micro SD card
String relative_path = "Documents/MyFolder";

Uri collectionUri = Uri.parse(collection);

ContentValues contentValues = new ContentValues();

contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, displayName);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
contentValues.put(MediaStore.MediaColumns.SIZE, filesize);
contentValues.put(MediaStore.MediaColumns.DATE_MODIFIED, modified );
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relative_path);
contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1)

Uri fileUri = context.getContentResolver().insert(collectionUri, contentValues);

При наличии URI можно открыть выходной поток для записи содержимого файла.

0 голосов
/ 12 февраля 2020

попробуйте поместить эту строку в файл манифеста для android Q: android: requestLegacyExternalStorage = "true" в теге приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...