Можно ли предоставить файл-архив в FileProvider, файла, который на самом деле не существует? - PullRequest
0 голосов
/ 01 января 2019

Фон

Я хочу иметь возможность поделиться некоторыми файлами (через намерение отправки) как один сжатый файл, через FileProvider .

Для намерения, все, что вы делаете, это добавляете ArrayList<Uri> в качестве параметра, например:

ArrayList<Uri> uris = MyFileProvider.prepareFileProviderFiles(...)
sharingIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)

Проблема

FileProvider может использоваться для доставки реальные файлы для внешних приложений.

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

Что я нашел

В соответствии с API FileProvider, я должен реализовать реальную обработку файлов:

По умолчаниюFileProvider автоматически возвращает ParcelFileDescriptor для файла, связанного с контентом: // Uri.Чтобы получить ParcelFileDescriptor, вызовите ContentResolver.openFileDescriptor.Чтобы переопределить этот метод, вы должны предоставить свой собственный подкласс FileProvider.

Таким образом, он возвращает ParcelFileDescriptor, но в соответствии со всеми функциями для создания ParcelFileDescriptor мне нужен настоящий файл:

Вопросы

  1. Возможно лион предлагает файл, который на самом деле не существует, но на самом деле является сжатым файлом другого файла?Возможно, поток заархивированного файла?

  2. Если это невозможно, могу ли я как-нибудь избежать этих ненужных файлов?Это значит, что я бы точно знал, что безопасно удалить сжатые файлы, которыми я поделился в прошлом?

  3. Если даже это невозможно, как я могу решить, когда можно их удалить?Просто положить их в папку кеша?Я помню, что папка кеша не всегда автоматически обрабатывается операционной системой, удаляя старые файлы, когда это необходимо.Разве это не правильно?

1 Ответ

0 голосов
/ 16 августа 2019

Да, это возможно.

  1. Скопируйте FileProvider в свой код (он понадобится вам для использования некоторых частных методов - сделайте их защищенными).Создайте свой класс, который расширяет FileProvider.

  2. В public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) используйте ParcelFileDescriptor.createReliablePipe () (или ParcelFileDescriptor.createPipe () для более старых android), чтобы создать канал и пару ParcelFileDescriptor.для этого: readFd и writeFd).

  3. Создайте отдельный поток и используйте его для архивирования и записи файла в дескриптор FileFescriptor writeFd.

  4. Возврат другогоParcelFileDescriptor (readFd) для чтения.

Моя реализация здесь: https://github.com/Babay88/AndroidCodeSamplesB/blob/master/ShareZipped/src/main/java/ru/babay/codesamples/sharezip/ZipableFileProvider.java

...