Обмен неизменными файлами между приложениями для Android

Я написал 2 приложения, чьи данные загружаются из Интернета.

Поскольку эти данные (около 40 МБ в нескольких zip-файлах) одинаковы, я хотел бы поделиться ими между двумя приложениями, чтобы они потребляли меньше полосы пропускания и меньше места для хранения для пользователя.

На данный момент я не нашел хорошего решения:

  • Первоначально я сохранил данные в общедоступном каталоге загрузки. Это простое решение, но оно требует разрешения на чтение, и я хочу этого избежать.
  • Тогда я подумал, что могу использовать контент-провайдеров (и inputStreams и mmaped ByteBuffers), но, по сути, мои приложения помещают много zip-файлов в большой ZipResourceFile, где: некоторые сжатые файлы читаются и копируются, некоторые несжатые файлы mmaped и используются как база данных люцена

Итак, я могу забыть о простом FileProvider, так как мне нужен файл, чтобы получить ZipFile, чтобы распаковать мои данные

Кроме того, может быть возможно создать ZipFileProvider, где мои файлы будут помещены в большой ZipResourceFile, часть которого будет обслуживаться поставщиком контента, как это делает эта библиотека:
https://github.com/jarondl/android-zipfileprovider/blob/master/src/net/jarondl/zipfileprovider/ZipFileProvider.java

Но если я получу какой-нибудь mtepped ByteBuffer через такой ZipFileContentProvider, сможет ли он иметь долгую и безопасную жизнь? (Должен ли я использовать Службу?) Что если процесс ZipFileContentProvider, который обслуживал ее, умер? Как насчет потребления памяти? Какие предостережения? Разве ContentProvider не должен использоваться недолго?

Есть ли лучшее решение?

ОБНОВИТЬ:

Это действительно отстой, что Android не может совместно использовать каталог для нескольких приложений из того же разработчика (и никто другой). Или это возможно?

UPDATE2:

Я подумал о том, чтобы сохранить файлы в getExternalFilesDir(), но следующее официальное предупреждение заставляет меня сильно нервничать (как насчет записи?):

Внимание Хотя каталоги, предоставляемые getExternalFilesDir () и getExternalFilesDirs(), недоступны для провайдера контента MediaStore, другие приложения с разрешением READ_EXTERNAL_STORAGE могут обращаться ко всем файлам на внешнем хранилище, включая эти. Если вам необходимо полностью ограничить доступ к своим файлам, вам следует вместо этого записать свои файлы во внутреннее хранилище.

1 ответ

Это действительно отстойно, что Android не может совместно использовать каталог для нескольких приложений из того же разработчика. Или это возможно?

До этого вы заявляете, что это возможно, но вы пытаетесь избежать этого

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

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

При необходимости добавьте разрешения на чтение / запись для двух приложений и получите доступ к своей собственной структуре папок, которая используется повторно. Это не обязательно должен быть общедоступный каталог загрузки. например <com.MyCompanyNamespace>/Data

Тогда вы могли бы:

  1. Проверьте вашу папку
  2. Еще проверьте общедоступную папку и перейдите к ней.
  3. Остальное прямо на сайт загрузки.

Нет ничего плохого в использовании разрешений на чтение / запись. И вы можете указать в магазине приложений или в приложении, почему нужны разрешения, чтобы облегчить их умы.

Я знаю, что у вас было много вопросов, но, надеюсь, этот простой ответ устраняет необходимость.

Другие вопросы по тегам