从ContentResolver.query()获取URI

时间:2016-06-23 19:03:24

标签: android uri android-contentprovider android-contentresolver

我正在查询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.jpguri.toString()与文件方案相同。尽管如此,图片很好地可以通过内容来定义:// uris,但我看不出它们是如何(以及如果)在图像表中表示的。

  2. 如果没有,我应该在DATA列中看到什么,以及如何从中获取Uri?

1 个答案:

答案 0 :(得分:10)

  

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

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

  

如何从中获取Uri?

你不是。您从Uri

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