如何验证图像URI在Android中是否有效?

如何验证图像URI在Android中是否有效?,android,validation,uri,Android,Validation,Uri,我正在建立自己的联系人选择器,因为我需要多选支持。除了联系人图像的一个小问题外,一切正常 对于没有图像的联系人,我将显示“无图像”图像。这适用于手机通讯簿中的联系人。然而,当涉及到来自谷歌联系人的图片时,我遇到了一个问题 我的大多数谷歌联系人都没有照片。但是,当我查询联系人数据库中的照片时,它仍然返回一个URI,格式为content://com.android.contacts/contacts/657/photo(这与没有照片的联系人的格式相同 然后,当我尝试将照片分配给QuickContac

我正在建立自己的联系人选择器,因为我需要多选支持。除了联系人图像的一个小问题外,一切正常

对于没有图像的联系人,我将显示“无图像”图像。这适用于手机通讯簿中的联系人。然而,当涉及到来自谷歌联系人的图片时,我遇到了一个问题

我的大多数谷歌联系人都没有照片。但是,当我查询联系人数据库中的照片时,它仍然返回一个URI,格式为
content://com.android.contacts/contacts/657/photo
(这与没有照片的联系人的格式相同

然后,当我尝试将照片分配给QuickContactBadge时,使用
bdg.setImageURI(pic);
将其设置为基本空白图片,并记录一条无声信息消息,说明:

INFO/System.out(3968): resolveUri failed on bad bitmap uri: 
content://com.android.contacts/contacts/657/photo
我需要知道我怎样才能 a)验证URI或
b)捕捉上面的信息信息
c)查询imageview/badge以查看是否找到有效图像

这样我就可以为这些联系人分配我的“无图像”图像。
我该怎么做呢

编辑20110812.0044

我已尝试根据劳伦斯的建议(他已被删除)将此添加到我的代码中:


虽然谷歌联系人现在得到我的“无图像”图像。。。那么所有其他联系人,包括那些确实有图像的联系人。

好的,我在浏览ImageView源代码后找到了如何做到这一点。它实际上使用的是QuickContactBadge自己的方法,但如果需要,可以随时提取

在设置QCB的图像后,我检查它的drawable是否为null,而不是尝试我自己的(根据Laurence的建议)。这样做效果更好,因为实际上ImageView小部件使用了大量的检查代码

这是我的最终代码:

bdg.setImageURI(pic);
if(bdg.getDrawable() == null) bdg.setImageResource(R.drawable.contactg);

正如我所希望和期望的那样,这一切都很完美。

仅回答如何检查MediaStore中的(数据)值的问题:

ContentResolver cr = getContentResolver();
String[] projection = {MediaStore.MediaColumns.DATA}
Cursor cur = cr.query(Uri.parse(contentUri), projection, null, null, null);
if(cur != null) {
    cur.moveToFirst();
    String filePath = cur.getString(0);

    if (filePath == null || filePath.isEmpty()) {
        // data not set
    } else if((new File(filePath)).exists()){
        // do something if it exists
    } else {
        // File was not found
        // this is binary data
    }
} else {
    // content Uri was invalid or some other error occurred 
}
灵感来自:和其他

还有一列
SIZE
可以检查: 如果没有数据值,它听起来应该包含0。但是如果数据是文件路径,我不知道它包含什么。

基于代码()我的Uri检查解决方案:


可能是图像未下载。我在whatsapp图像方面也遇到了类似的问题。 实现这一点的一种方法如下:

InputStream is = null;
try {
   is = context.getContentResolver().openInputStream(myuri);
}catch (Exception e){
   Log.d("TAG", "Exception " + e);
}

if(is==null)
    //Assign to "no image"

我将此代码用于具有file://权限的Uri

Uri resimUri = Uri.parse(path_str);
File imgFile = new File(resimUri.getPath());
if (imgFile.exists()) {
    // file exists
}else {
    // file is not there
}

您知道SD卡/内存中存储联系人图像的位置吗?如果你能找到这个文件夹,然后遍历所有的成员,你就可以验证所选的图像是否存在content://com.android.contacts/...URI,它只是指数据库存储中的
Contacts2.db
文件中的一个字段。查看SQLLite编辑器中的照片视图,看起来照片作为原始二进制数据直接存储在数据库中(数据
字段不显示路径,只显示
(数据)
)。其中一个联系人的照片不显示
(数据)
,但显示空白字段。我是否可以查询URI以查看它是否返回NULL?真正的问题是:为什么那些伪造的照片记录存储在数据库中?这很好,但如果使用适配器,则无法通过这种方式进行检查。所以你应该在这真的很糟糕之前检查uri,尤其是在网格视图或列表视图中。@Olayinka-想再详细解释一下并添加到对话中吗?“这很糟糕。”这并不能解释太多。那么应该怎么做?@eidylon这很糟糕,因为在加载多个项目的列表视图中,每次调用
setImageUri
都会创建新的位图,这需要时间和内存。gridview在项目模板中确实有一个QuickContactBadge。我希望谷歌的QCB会重用相同的位图。所以不管怎样,不管它是使用联系人的图片还是使用我的“无图像”图片,它还是会创建一个位图。我创建QCB不是为了测试图像。
InputStream is = null;
try {
   is = context.getContentResolver().openInputStream(myuri);
}catch (Exception e){
   Log.d("TAG", "Exception " + e);
}

if(is==null)
    //Assign to "no image"
Uri resimUri = Uri.parse(path_str);
File imgFile = new File(resimUri.getPath());
if (imgFile.exists()) {
    // file exists
}else {
    // file is not there
}