Я написал 2 приложения, данные которых загружаются из Интернета.обмен неизменяемыми файлами между приложениями для Android
Поскольку эти данные (около 40 МБ, в нескольких ZIP-файлах) одинаковы, я хотел бы поделиться им между двумя приложениями, чтобы он потреблял меньше полос пропускания и меньше места для хранения для пользователя.
На данный момент, я не нашел хорошее решение:
- изначально, я сохранил данные в каталоге общественной загрузки. Это простое решение, но для этого требуется разрешение на чтение, и я хочу этого избежать.
- Тогда я думал, что я мог бы использовать контент-провайдер (и inputStreams и mmaped ByteBuffers), но, в центре, мои приложения поместить много Zip файлов в большом ZipResourceFile где: некоторых сжатые файлы считываются и копируюсь несколько несжатых файлов которые mmaped и используются в качестве базы данных Lucene
Таким образом, я могу забыть о простом FileProvider, как мне нужен файл, чтобы получить ZipFile, чтобы распаковывать мои данные
Кроме того, это может быть возможно построить ZipFileProvider, где мои файлы будут помещены в большой файл ZipResourceFile, часть которого будет подана тьфу контент-провайдер, как эта библиотека делает:
https://github.com/jarondl/android-zipfileprovider/blob/master/src/net/jarondl/zipfileprovider/ZipFileProvider.java
Но, если я получаю некоторые mmaped ByteBuffer через такой ZipFileContentProvider, сможет ли он иметь долгую и безопасную жизнь? (Должен ли я использовать Сервис?) Что делать, если процесс ZipFileContentProvider, который служил ему, умер? Что относительно потребления памяти? Каковы предостережения? Разве ContentProvider не должен использоваться в краткосрочной перспективе?
Есть ли лучшее решение?
UPDATE:
Это действительно засасывает, что андроид не может делить каталог для нескольких приложений из того же developper (, и никто еще). Или это возможно?
UPDATE2:
Я считал хранение файлов на getExternalFilesDir(), но следующее официальное предупреждение делает меня очень нервным (что о написании?):
Внимание Хотя в каталогах, предоставленных getExternalFilesDir() и getExternalFilesDirs() недоступны для носителя MediaStore , другие приложения с разрешением READ_EXTERNAL_STORAGE могут получить доступ ко всем файлам на внешнем хранилище, включая их. Если вам нужно , чтобы полностью ограничить доступ к вашим файлам, вы должны написать свои файлы во внутреннее хранилище.
Не можете ли вы использовать обертку ZipInputStream InputStream, открытую из ContentResolver? –
Не думал об этом. Производительность по сравнению с ZipFileProvider должна быть ужасной, хотя, когда вам нужно пройти весь файл, чтобы прочитать последний zipEntry ... – Lakedaemon