Ответ 1
MemoryFile поддерживает это, но открытый API еще не завершен.
API-интерфейсы провайдера/преобразователя контента обеспечивают сложный, но надежный способ передачи данных между процессами с использованием методов URI и openInputStream()
и openOutputStream()
. Пользовательские поставщики контента могут переопределить метод openFile()
с помощью специального кода, чтобы эффективно разрешить URI в Stream
; однако, сигнатура метода openFile()
имеет тип возврата ParcelFileDescriptor
, и неясно, как можно создать правильное представление для динамически сгенерированного контента для возврата из этого метода.
Возврат памяти, сопоставленной с InputStream от поставщика контента?
Существуют ли примеры реализации метода ContentProvider.openFile()
для динамического содержимого в существующей кодовой базе? Если вы не можете предложить исходный код или процесс для этого?
MemoryFile поддерживает это, но открытый API еще не завершен.
Посмотрите этот отличный пример проекта из всегда полезного CommonsWare. Он позволяет создавать канал ParcelFileDescriptor с любым входящим входом InputStream с одной стороны и принимающим приложением на другой стороне:
https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider/Pipe
Основные части создают канал в openFile
:
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
ParcelFileDescriptor[] pipe=null;
try {
pipe=ParcelFileDescriptor.createPipe();
AssetManager assets=getContext().getResources().getAssets();
new TransferThread(assets.open(uri.getLastPathSegment()),
new AutoCloseOutputStream(pipe[1])).start();
}
catch (IOException e) {
Log.e(getClass().getSimpleName(), "Exception opening pipe", e);
throw new FileNotFoundException("Could not open pipe for: "
+ uri.toString());
}
return(pipe[0]);
}
Затем создайте поток, который будет поддерживать полный канал:
static class TransferThread extends Thread {
InputStream in;
OutputStream out;
TransferThread(InputStream in, OutputStream out) {
this.in = in;
this.out = out;
}
@Override
public void run() {
byte[] buf = new byte[8192];
int len;
try {
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.flush();
out.close();
} catch (IOException e) {
Log.e(getClass().getSimpleName(),
"Exception transferring file", e);
}
}
}