Возвращаете сопоставленный с памятью InputStream от поставщика контента?

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

InputStream is = getContentResolver().openInputStream(pictureUri);

Это хороший API, и на стороне сервера фактический поставщик контента вызовет:

public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
  // Open a proper ParcelFileDescriptor, most likely using openFileHelper(uri, mode)
}

Но что, если изображение, сопоставленное с URI, находится не в файловой системе, а в виде ресурса памяти или генерируется на лету.

Могу ли я создать отображение памяти File или InputStream или что-то еще, чтобы мне не требовалось сохранять временный файл на диск, просто чтобы иметь возможность вернуть его потребителю моего поставщика контента?


person PeyloW    schedule 09.10.2009    source источник


Ответы (2)


Это тяжело. Вы можете обойтись без использования всего, что может использовать интерфейс Socket. Я этого не делал, но вот что заставляет меня так думать:

http://developer.android.com/reference/android/os/ParcelFileDescriptor.html#fromSocket(java.net.Socket)

И Socket теоретически может быть интернет-ресурсом или чем-то еще... если вы готовы работать на уровне Socket. Я бы, наверное, просто сдался и создал временный файл. Возможно, это делает меня трусом.

person Eric Mill    schedule 10.10.2009
comment
Это решение, которое может сработать, но не так, как я хочу. Я действительно хочу иметь возможность последовательно использовать метод ContentResolver#openInputStream() для чтения всех видов удаленных данных. Независимо от того, как сервер создает/получает данные. Речь идет о том, чтобы не раскрывать реализацию сервера клиенту. - person PeyloW; 12.10.2009
comment
@PeyloW ты нашел решение этой проблемы? Я тоже ищу решение. - person Sunny; 19.01.2012
comment
@Sunny Нет, это не взлом. В итоге я сохранил временные файлы и отправил файловые дескрипторы. - person PeyloW; 19.01.2012
comment
создание временного файла действительно работает и работает быстрее, а еще лучше. Я создаю провайдера для кэширования другого провайдера, поэтому у меня есть простое и быстрое решение. Один контент-провайдер занимается кэшированием и передает запрос другому для генерации. Единственным недостатком является пустая трата места на SD. - person Luiz Felipe; 15.05.2020

Начиная с Android-9, вы можете сделать канал, используя ParcelFileDescriptor. Вы можете впихнуть в него до 64 КБ и покончить с этим, или вы можете настроить другой поток, чтобы заполнить его после того, как он будет прочитан. Смотрите ответ здесь для более подробной информации:

Пользовательский ContentProvider — openInputStream(), openOutputStream()

person Hans-Christoph Steiner    schedule 06.02.2013