Сохранение файла в Downloads Android

Задача — создать файл в каталоге Downloads из вашего приложения на платформе Android.

Пусть это будет какой то текстовый файл, который наше приложение умеет генерировать. Формат файла — XML.

Наша задача решается по-разному для андроидов 10+ и андроидов 9-. Потому скелет кода будет выглядеть следующим образом (в контексте вашего activity):

Далее рассмотрим оба кейса.

Сценарий для Android 6 — 9

Здесь используется специальный механизм получения разрешения на запись. В нашем случае это WRITE_EXTERNAL_STORAGE. Если разрешение уже выдано при установке программы или в ходе её работы, то проверка проходит успешно. В противном случае запускается диалог, где разрешение запрашивается у пользователя.

В этот диалог, в том числе, отправляется ваш маркер, по которому вы потом сможете различить этот запрос среди прочих. У меня для этого служит константа XMLWRITEFILE.

Ваше activity должно реализовать callback метод onRequestPermissionsResult, который получает ответ пользователя из описанного выше диалога.

В обработчике ответа мы, при получении требуемых прав, запускаем экспорт данных. Иначе выводим сообщение, что создание файла не возможно.

В манифесте приложения, также потребуется внести некоторые изменения.

Нам важен здесь тег — uses-permission и дополнительный атрибут в теге application.

Создание и запись файла в Downloads под Android 9 и ниже

Все разрешения получены, теперь можно рассмотреть как создать файл в папке Downloads.

Довольно простой кейс — вы создаёте файл в DIRECTORY_DOWNLOADS, и пишите туда нужное вам содержимое.

Создание и запись файла в Downloads под Android 10 и выше

Здесь поток записи в файл получается через регистрацию нашего файла в медиа хранилище. Сначала нужно подготовить описание файла, это объект типа ContentValues.

На основе описания, медиа хранилище регистрирует файл и подготавливает вам Uri дескриптор. Остаётся только произвести запись данных.

Если resolver.insert возвращает null

Из документации не очень понятно как обработать такое событие. У меня эта ситуация возникала, когда я удалял ранее созданные файлы и снова пытался произвести экспорт. В итоге, это удалось решить генерацией файла с уникальным именем

Т.е. я добавил дату-время в имя файла.

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

Написать комментарий

Мало букафф? Читайте есчо !

Создание экземпляра класса по его имени

Март 14, 2023 г.

Получение доступа к классу в режиме рантайм добавляет известной гибкости. Одна из типичных задач - создание экземпляра класса по его имени. В котлин это делается вот так: [crayon-66e87f2c006e3449532108/] Есть несколько нюансов/рекомендаций. ...

Читать

Конструирование визуальных компонентов в kotlin

Март 11, 2023 г.

Android studio предоставляет набор стандартных компонентов, таких как TextView, LinearLayout и пр. Но довольно часто приходится оперировать группами таких ...

Читать

 

Комментарии к «Сохранение файла в Downloads Android»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий:

Много комментариев в “Сохранение файла в Downloads Android”

  1. bau009:

    Android 7
    outputFile.writeText(fileContent)
    файл сохраняется, и читается приложением. Но! не читается встроенным проводником и не виден по USB в папке Downloads до перезагрузки устройства.
    После перегрузки становится доступен.
    Что ещё нужно подкинуть системе, чтоб разблокировать файл? Отвязать от приложения без перегрузки.
    Android Studio Koala | 2024.1.1 Patch 1

  2. bau009:

    разобрался с предыдущим своим комментарием, хотя он тут и не отобразился.
    после: outputFile.writeText(fileContent)
    необходимо поместить файл в библиотеку:
    MediaScannerConnection.scanFile(
    applicationContext, arrayOf(outputFile.toString()),
    null, null)
    тогда он будет сразу доступен для чтения, и виден по USB