相关疑难解决方法(0)

如何在Android内容提供商中存储大blob?

我有一些大文件(图像和视频),我需要存储在内容提供商.android文档表明......

如果您公开的字节数据太大而无法放入表本身 - 例如大型位图文件 - 将数据公开给客户端的字段实际上应该包含content: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));
Run Code Online (Sandbox Code Playgroud)

意见/问题...

  1. 如何正确重建存储/恢复的uri?(这是表格中的文字)
  2. 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);
    
    Run Code Online (Sandbox Code Playgroud)

    --frameworks /碱/核心/ JAVA /机器人/插件/ ImageView.java

我搞定了.我从MediaStore和MediaProvider中提取了一些提示.包含数据的文件根据内容提供者(目录),列名,行ID和媒体类型命名.然后内容解析器获取文件描述符,如此...

Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);
Run Code Online (Sandbox Code Playgroud)

......内容提供商以实物回应......

@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 |= …
Run Code Online (Sandbox Code Playgroud)

android inputstream android-contentresolver android-contentprovider

13
推荐指数
1
解决办法
1万
查看次数