我有一些需要存储在内容提供商中的大文件(图像和视频)。android文档表明...
如果您要公开太大而无法放入表本身的字节数据(例如大型位图文件),则将数据公开给客户端的字段实际上应该包含一个内容:URI 字符串。这是允许客户端访问数据文件的字段。该记录还应该有另一个名为“_data”的字段,其中列出了该文件在设备上的确切文件路径。此字段不打算由客户端读取,而是由 ContentResolver 读取。客户端将在包含项目 URI 的面向用户的字段上调用 ContentResolver.openInputStream()。ContentResolver 将为该记录请求“_data”字段,并且由于它具有比客户端更高的权限,它应该能够直接访问该文件并将该文件的读取包装返回给客户端。-- http://developer.android.com/guide/topics/providers/content-providers.html#creating
我很难找到一个例子。特别是我希望在 ImageView 上下文中使用位图。考虑以下代码准代码(它不起作用)...
ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));
观察/问题...
- 如何正确重建存储/恢复的 uri?(它是表中的文字)
setImageURI 实现使用内容解析 openInputStream 所以这应该可以工作。
String scheme = mUri.getScheme(); ... } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme)) { try { d = Drawable.createFromStream( mContext.getContentResolver().openInputStream(mUri), null);
--frameworks/base/core/java/android/widget/ImageView.java
我让它工作了。我从 MediaStore 和 MediaProvider 得到了提示。包含数据的文件根据内容提供者(目录)、列名、行 ID 和媒体类型命名。内容解析器然后像这样获取文件描述符......
Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);
...内容提供者以实物回应...
@Override
public ParcelFileDescriptor openFile (Uri uri, String mode) {
int imode = 0;
if (mode.contains("w")) imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
if (mode.contains("r")) imode |= ParcelFileDescriptor.MODE_READ_ONLY;
if (mode.contains("+")) imode |= ParcelFileDescriptor.MODE_APPEND;
List<String> pseg = uri.getPathSegments();
if (pseg.size() < 3) return null;
try {
File filePath = filePathFromRecord(pseg.get(2), pseg.get(1));
return ParcelFileDescriptor.open(filePath, imode);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}