Как передавать файлы между Android-приложениями, работающими на одном и том же устройстве?

Я пишу приложение для Android, которое взаимодействует со службой RESTful. Эта веб-служба, по сути, предоставляет файловую систему и метаданные, а также CRUD доступ к файлам. Мое приложение получает метаданные и предоставляет их сторонним приложениям через ContentProvider.

Мне нужно добавить возможность для приложений сторонних производителей, работающих на том же устройстве, что и мое приложение, в CRUD-файлы, делая запросы к/от моего приложения (не напрямую с сервером). Это означает, что они должны либо отправлять или получать содержимое файлов (которые, как правило, являются XML или изображениями) через мое приложение.

Я придумал два подхода для реализации этого:

Вариант 1 - Использование ContentProvider.openFile

Это кажется очевидным выбором для предоставления сторонним приложениям возможности чтения файлов из моего ContentProvider. Я думаю, что это начинает становиться сложным, когда этим приложениям нужно создавать или обновлять файлы через мой `ContentProvider'. Мне понадобится обратный вызов, когда они закончатся, чтобы знать, когда отправлять новый/измененный файл обратно на сервер. Думаю, для этой цели я мог бы использовать FileObserver.

Вариант 2 - Используя мессенджер через службу

При таком подходе я могу посылать файлы между моим приложением и клиентскими приложениями через Messenger. Файлы должны быть переданы через Bundle, поэтому я не уверен, какой формат лучше всего подходит для их передачи (File, FileDescriptor, массив байтов, что-нибудь еще??). У меня нет хорошего понимания, будет ли это вызывать проблемы, если файлы станут большими.

Вариант 3 - гибридный подход

  1. Использовать папку(и) на внешнем хранилище как дроп-бокс
  2. Сообщать CRUD-запросы и содержимое дроп-бокса, через Messenger/Service
  3. Use the ContentProvider to store the status of requests
  4. 3rd party app gets status updates through ContentObserver

Summary

I think using ContentProvider was the ideal solution, but it seems that the API doesn't fully support my use case. Меня беспокоит, что попытка пойти по этому пути может привести к реализации kludgy. Если я использую подход Messenger и Service, я не уверен, что это самый надежный способ передачи файлов через Bundle.

Гибридный подход кажется довольно надежным, но наиболее сложным для реализации. Файлы на самом деле не передаются, поэтому производительность должна быть хорошей. Тем не менее, боюсь, что это чрезмерная архитектура решения.

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

25
задан Eric Levine 5 July 2012 в 14:23
поделиться