内容提供者消费者的客户端我可以做这样的事情,以获得正确的InputStream来读取图片:
InputStream is = getContentResolver().openInputStream(pictureUri);
Run Code Online (Sandbox Code Playgroud)
这是一个很好的API,并且在服务器端,实际的内容提供者会调用:
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
// Open a proper ParcelFileDescriptor, most likely using openFileHelper(uri, mode)
}
Run Code Online (Sandbox Code Playgroud)
但是如果映射到URI的图片不是在文件系统上找到,而是作为内存资源,或者是动态生成的.
我可以建立存储器映射File或InputStream,或其他任何东西,所以,我不保存临时文件的磁盘需要,只是为了能够将其返回到我的内容提供商的消费者?
我有一个使用ContentProvider类的应用程序.在openFile方法中,我需要能够解码文件并作为数据流返回.所以我决定使用内置管道.
问题是如果我使用createPipe方法,我只能写入64KB.之后我无法将数据写入管道.另请注意,在数据完全解码并写入管道之前,我无法读取.
package com.aujas.html.viewer.content;
public class LocalFileContentProvider extends ContentProvider {
private static final String URI_PREFIX = "content://com.aujas.html.viewer.localfile.dec/";
public static File file;
public String filename;
public ParcelFileDescriptor[] parcels;
public static String constructUri(String url) {
String editString = url.replaceAll("%20", " ");
int n = editString.length();
String uri = editString.substring(5, n - 1);
Log.d("URI", uri);
return URI_PREFIX + uri + "\"";
}
public ParcelFileDescriptor openFile(Uri uri, String mode) {
Log.d("OPEN", uri.getPath());
return parcels[0];
}
@Override
public boolean onCreate() {
return true;
}
@Override …Run Code Online (Sandbox Code Playgroud)