我有一些需要存储在内容提供者中的大文件(图片和视频)。 Android的文件表明...如何在android内容提供者中存储大块?
如果你露出那 太大,放在表本身字节数据 - 如大的位图文件 - 在 场暴露的数据给客户 应实际上包含一个内容:URI 字符串。这是允许 客户端访问数据文件的字段。 记录还应该有另一个字段,名为“_data”的 ,该字段在该设备上列出该文件的确切文件路径 。 此字段不打算由客户端读取 ,而是由 ContentResolver读取。客户将拨打 ContentResolver.openInputStream() 面向用户的字段,该字段为该项目保存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 /基/核心/ JAVA /安卓/空间/ 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内容提供商中存储大型斑点”。在任何情况下,简短的回答是你使用openFile和朋友描述的方式。 – phreed 2010-11-13 20:18:22