从内容提供程序返回内存映射的InputStream?

时间:2009-10-09 05:54:34

标签: android memory-mapped-files android-contentprovider

内容提供者消费者的客户端我可以做这样的事情,以获得正确的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的图片不是在文件系统上找到,而是作为内存资源,或者是在运行中生成的。

我可以创建内存映射FileInputStream或其他任何内容,这样我就不需要将临时文件保存到磁盘,只是为了能够将其返回给我的内容提供商消费者?

2 个答案:

答案 0 :(得分:1)

这很难。 可能能够使用任何可以使用Socket接口的东西。我还没有这样做,但这就是让我这么想的原因:

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

理论上,Socket可以是一个Internet资源,或者大多数东西......如果你愿意在Socket级别工作。我可能只是放弃并创建临时文件。也许这让我变得胆怯。

答案 1 :(得分:1)

从android-9开始,你可以使用ParcelFileDescriptor创建一个管道。你可以填充最多64k并完成它,或者你可以设置另一个线程在读取后​​填充它。有关详细信息,请参阅此处的答案:

Custom ContentProvider - openInputStream(), openOutputStream()