从ContentResolver.query()获取URI

8
我正在查询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:// uri定义,但我不知道(和不知道)它们如何在图像表中表示。

  2. 如果不能,那么我应该在 DATA 列中期望什么,并如何从中获取Uri?

1个回答

28

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

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

如何从中获取 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()访问? - natario
重述一下,使用ContentUri构建的Uri是否安全(即在可移动存储中的图像等边缘情况下也能正常工作),还是我需要在某个地方添加检查? - natario
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接