【发布时间】:2011-04-22 10:39:44
【问题描述】:
我有一些大文件(图像和视频)需要存储在内容提供商中。 android文档表明...
如果您要公开的字节数据是 太大而不能放在桌子上—— 比如一个大的位图文件—— 向客户端公开数据的字段 实际上应该包含一个内容:URI 细绳。这是给出的领域 客户端访问数据文件。这 记录还应该有另一个字段, 命名为“_data”,列出了确切的 该文件在设备上的文件路径。 此字段不打算阅读 由客户,但由 内容解析器。客户会打电话 ContentResolver.openInputStream() on 持有 URI 的面向用户的字段 为该项目。 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;
}
【问题讨论】:
-
糟糕!我通过编辑原始文本而不是发布答案来回答我自己的问题,即“如何在和 android 内容提供程序中存储大型 blob”。无论如何,简短的回答是您按照描述的方式使用 openFile 和朋友。
标签: android inputstream android-contentprovider android-contentresolver