2012-04-03 5 views
2

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

Файлы загружаются и сохраняются в виде массивов байтов с некоторыми сопутствующими метаданными, которые включают в себя тип MIME и расширение файла.

Пользовательский ContentProvider кажется очевидным путем, так как моему приложению необходимо сохранить контроль над загруженными файлами - то есть доступ к другим приложениям должен быть доступен только для чтения, а мое приложение должно контролировать, когда/когда файлы будут удалены ,

Когда речь заходит о реализации моего заказа ContentProvider, я не совсем понимаю некоторые моменты. Учебные пособия я смотрел только, казалось, касается обмена данными между двумя

  1. Достаточно просто переопределить и реализовать openFile() и внедрить методы query(), insert() и т.д., как «ничего не делать» заглушки?
  2. Предполагая, что реализация openFile() - это способ, как я могу подойти к созданию ParcelFileDescriptor из массива байтов?

Примечание: Если это вообще возможно, мне необходимо полностью вернуться к уровню API 3 (кекс).

ответ

2

Я сделал еще несколько копаний и, наконец, наткнулся на this source для Open Android AttachmentProvider (для своего почтового клиента).

Таким образом, чтобы ответить на мои собственные вопросы:

  1. Похоже, мне нужно реализовать openFile(), getType() и query(). Их реализация query() обеспечивает доступ к столбцам для отображаемого имени, uri, filesize и столбца '_ID' (as recommended by the dev guide).
  2. ParcelFileDescriptor s специально разработаны для работы с File с (я предполагаю, что ключ находится в имени!), Так что единственный способ сделать это, чтобы написать массив байтов в файловой системе, а затем создать для этого ParcelFileDescriptorFile. К счастью, кажется, я могу написать в частную папку приложения, чтобы другие приложения не возились с моими файлами.
+0

Другой возможностью может быть использование MemoryFile. Я сейчас работаю над этим решением, надеюсь, производительность быстрее, чем обычные файлы. – Georgie

+0

Что касается моего комментария выше, я попытался использовать MemoryFile в реализации openFile() поставщика контента, но этого не удалось. Одна из причин заключается в том, что поддержка ParcelFileDescriptor, связанная с MemoryFile, исчезает в последних версиях Android. Еще до этого для доступа требовались рефлексивные трюки. – Georgie

+0

Есть ли способ передать массив байтов в 'ParcelFileDescriptor'? По соображениям безопасности я не могу сохранить PDF-файл на телефоне. –

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