android - framework - Proveedor de contenido personalizado-openInputStream(), openOutputStream()
contentresolver android developer (2)
Echa un vistazo a este gran proyecto de ejemplo de la siempre útil CommonsWare. Le permite crear un conducto ParcelFileDescriptor con cualquier InputStream que desee en un lado, y la aplicación receptora en el otro lado:
https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider/Pipe
Las partes clave son crear la tubería en 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]);
}
Luego crea un hilo que mantiene el tubo lleno:
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);
}
}
}
Las API del proveedor de contenido / resolución proporcionan una forma complicada pero robusta de transferir datos entre procesos mediante un URI y los openInputStream()
y openOutputStream()
. Los proveedores de contenido personalizado tienen la capacidad de anular el método openFile()
con un código personalizado para resolver efectivamente un URI en un Stream
; sin embargo, la firma del método de openFile()
tiene un tipo de retorno ParcelFileDescriptor
y no está claro cómo se puede generar una representación adecuada para el contenido generado dinámicamente para regresar de este método.
¿Devuelve un InputStream asignado de memoria desde un proveedor de contenido?
¿Hay ejemplos de la implementación del método ContentProvider.openFile()
para el contenido dinámico en la base de código existente? Si no, ¿puedes sugerir el código fuente o el proceso para hacerlo?
MemoryFile admite esto, pero la API pública no se ha finalizado.