从 ContentResolver.query() 获取 URI

Get URI from ContentResolver.query()

我正在查询 Images table 以获取 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. 这能保证有效吗?上面的查询是否保证数据列中的 return 路径?它适用于我 phone 中的所有图片:path 始终是一个路径,如 /storage/0/whatever.jpguri.toString() 是相同的,但具有文件方案。尽管如此,图片仍然可以很好地由 content:// uris 定义,但我看不出这些图片是如何(以及是否)在图像中表示的 table.

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

Is the query above guaranteed to return paths in the data column?

它应该return 东西。那个 "something" 可能无法使用。例如,图像可能在可移动存储上,您无法直接访问它。

how to get an Uri from it?

你不知道。您从 _ID:

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