自定义ContentProvider – openInputStream(),openOutputStream()

内容提供者/parsing器API提供了使用URI和openInputStream()openOutputStream()方法在进程之间传输数据的复杂但可靠的方法。 自定义内容提供者可以用自定义代码覆盖openFile()方法,以有效地将URIparsing为Stream ; 然而, openFile()的方法签名具有ParcelFileDescriptor返回types,并且不清楚如何为dynamic生成的内容生成适当的表示以从此方法返回。

从内容提供者返回一个内存映射的InputStream?

有没有在现有的代码库中为dynamic内容实现ContentProvider.openFile()方法的例子? 如果不是,你能build议源代码或进程吗?

Solutions Collecting From Web of "自定义ContentProvider – openInputStream(),openOutputStream()"

MemoryFile支持这个,但公共API还没有最终确定。

从总是有用的CommonsWare中查看这个伟大的示例项目。 它可以让你创build一个ParcelFileDescriptorpipe道,使用任何你想要的InputStream和一边的接收应用程序:

https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider/Pipe

关键部分是在openFile中创buildpipe道:

 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]); } 

然后创build一个线程来保持pipe道充满:

 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); } } }