2016-11-28 6 views
0

Я написал 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 могут получить доступ ко всем файлам на внешнем хранилище, включая их. Если вам нужно , чтобы полностью ограничить доступ к вашим файлам, вы должны написать свои файлы во внутреннее хранилище.

+0

Не можете ли вы использовать обертку ZipInputStream InputStream, открытую из ContentResolver? –

+0

Не думал об этом. Производительность по сравнению с ZipFileProvider должна быть ужасной, хотя, когда вам нужно пройти весь файл, чтобы прочитать последний zipEntry ... – Lakedaemon

ответ

1

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

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

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

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

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

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

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

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

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

+1

1) деньги: некоторые пользователи избегают приложений, запрашивающих разрешения 2) безопасность: что делать, если вредоносное приложение с разрешение на чтение/запись разрешает доступ к моим файлам на внешнем хранилище (например, getExternalFilesDir()) и тонко сжимает их (так что иногда происходит сбой приложения)? – Lakedaemon

+0

@Lakedaemon Пока я согласен с точкой 1, это небольшой процент, к которому большинство, если не все, могут быть заново подтверждены, указав перед установкой, для чего используется разрешение. Aka хранения файлов общего доступа между приложениями. Не считывает никаких других данных с устройства. (указано выше) 2. Затем вы попали в другую аудиторию, которая вообще не читает разрешения. Это не поддается контролю. Но следует учитывать, что если бы это было так, это должно было быть нацелено на каждый файл (вряд ли конкретный). На что повлияют все приложения/устройства. Ваше приложение вряд ли будет обвинено. – Doomsknight

+0

, если каждое приложение записывает данные в getExternalFileDirs() и запрашивает разрешение на чтение для доступа к данным других приложений, оно действительно обеспечивает лучшую производительность класса с требованием разрешения на чтение как компромисс. Если не найдено лучшего решения, я приму свой ответ. – Lakedaemon

Смежные вопросы