【问题标题】:Get URI from ContentResolver.query()从 ContentResolver.query() 获取 URI
【发布时间】:2016-06-23 19:03:23
【问题描述】:

我正在查询Images表获取MediaStore.Images.Media.EXTERNAL_CONTENT_URI目录下的所有图片。

查看以下查询:

String[] what = new String[]{ MediaStore.Images.ImageColumns.DATE_TAKEN,
            MediaStore.Images.ImageColumns._ID,
            MediaStore.Images.ImageColumns.MIME_TYPE,
            MediaStore.Images.ImageColumns.DATA };

String where = MediaStore.Images.Media.MIME_TYPE + "='image/jpeg'" +
            " OR " + MediaStore.Images.Media.MIME_TYPE + "='image/png’";

Cursor cursor = getContext().getContentResolver()
                    .query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                            what,
                            where,
                            null,
                            MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC”);

现在,我想要一个 Uri 指向每个结果。 这就是我现在正在做的事情:

int dataIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
String path = cursor.getString(dataIndex);
final Uri uri = Uri.fromFile(new File(path));

例如,我从DATA 列中获取路径,创建一个文件并使用Uri.fromFile。我有两个问题。

  1. 这能保证工作吗?上面的查询是否保证返回数据列中的路径?它适用于我手机中的所有图片:path 始终是路径,如/storage/0/whatever.jpg,和uri.toString() 相同,但使用文件方案。不过,图片可以很好地由 content:// uris 定义,但我看不到这些图片是如何(以及是否)在 images 表中表示的。

  2. 如果不是,我应该在 DATA 列中期待什么,以及如何从中获取 Uri?

【问题讨论】:

    标签: android uri android-contentprovider android-contentresolver


    【解决方案1】:

    上面的查询是否保证返回数据列中的路径?

    它应该返回一些东西。那个“东西”可能无法使用。例如,图像可能位于可移动存储上,您无法直接访问它。

    如何从中获取 Uri?

    你没有。你从_ID构造一个Uri

    Uri imageUri=
      ContentUris
        .withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
           cursor.getInt(cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID)));
    

    【讨论】:

    • 有趣,谢谢。关于“可能无法使用的部分”只有一件事。据我了解,您的意思是我不能在这些上调用 new File(path)。但是,如果我按照您所说的那样构建 Uri,它们可以通过 ContentResolver.open() 访问吗?
    • 重新措辞,使用 ContentUri 构建的 Uri 是否安全(即,即使在可移动存储中的图像等边缘情况下也可以使用)还是应该在某处添加检查?
    • @mvai:只要你有READ_EXTERNAL_STORAGE,你应该没问题。不过,建议进行测试。 :-) 我用视频做的工作比静态照片还多,而且看起来还不错。最坏的结果就是你使用File 方法所得到的结果:无法访问。
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 2010-12-10
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多