Как передать двоичные данные между двумя приложениями с помощью Content Provider?

Мне нужно передать некоторые двоичные данные между двумя приложениями для Android с помощью Content Provider (sharedUserId не подходит).

Я бы предпочел не передавать данные (сохранение, хранящееся в виде файла небольшого размера ‹ 20 КБ) в виде файла (т. е. переопределение openFile()), поскольку это потребовало бы какой-то сложной схемы временного файла, чтобы справиться с параллелизмом с несколькими контентом. провайдерские доступы и работающая игра.

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

Кажется, что создание файла в памяти невозможно из-за возвращаемого типа openFile().

query() должен возвращать курсор. Использование MatrixCursor невозможно, так как оно применяет toString() ко всем сохраненным объектам при чтении.

Что мне нужно сделать? Реализовать собственный курсор? Этот класс имеет 30 абстрактных методов. Я читаю файл, помещаю его в базу данных SQLite и возвращаю курсор?

Сложность этой, казалось бы, простой задачи поражает воображение.


person Viktor    schedule 06.01.2011    source источник
comment
Зачем вам нужно использовать мьютекс?   -  person Squonk    schedule 07.01.2011
comment
@MisterSquonk: Возможно, игра одновременно пишет сохранение в другом потоке.   -  person Viktor    schedule 07.01.2011


Ответы (2)


Почему бы не указать данные в виде строки Base64?

person Aliostad    schedule 06.01.2011
comment
Истинный. Это кажется неправильным, но я думаю, что API действительно не дает лучшей альтернативы. - person Viktor; 07.01.2011
comment
Да, к сожалению. Имейте в виду, что Base64 поддерживается только в +2.2 (уровень API 8), а не в 2.1 или 1.6. - person Aliostad; 07.01.2011

Вы пробовали использовать потоки? Это будет работать

Из документации: «Если запись в таблице представляет собой содержимое: URI, вы никогда не должны пытаться открыть и прочитать файл напрямую (с одной стороны, проблемы с разрешениями могут привести к сбою). Вместо этого вы должны вызвать ContentResolver.openInputStream() для получить объект InputStream, который можно использовать для чтения данных».

Ссылка: http://developer.android.com/guide/topics/providers/content-providers.html

Может быть, что-то вроде этого, если вы используете намерения:

protected void onActivityResult(int requestCode, int resultCode, Intent intent){
  InputStream is = getContentResolver().openInputStream(intent.getData())
...

person Phyrum Tea    schedule 06.01.2011