android简单方法检查联系人有图像

时间:2014-11-25 09:24:17

标签: android image contact

我只是使用universal-image-loader在listview上显示联系人图像。我只是得到这样的照片。

public String getPhotoUri(String contactId) {
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactId);
    return uri + "";
}

并在listview中显示如下:

 ImageLoader.getInstance().displayImage(getPhotoUri(item.getContactId()), holder.ivHead);

效果很好。但我的问题是当联系人没有图像时。我将在下面收到错误:

java.lang.NullPointerException
        at com.nostra13.universalimageloader.utils.IoUtils.copyStream(IoUtils.java:69)
        at com.nostra13.universalimageloader.cache.disc.impl.BaseDiscCache.save(BaseDiscCache.java:109)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(LoadAndDisplayImageTask.java:291)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDisk(LoadAndDisplayImageTask.java:273)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:229)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:135)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:841)

它不会崩溃。我可以在image-univeral-loader上使用showImageOnFail方法来显示默认图像。但我讨厌NPE。当我滚动时,几乎所有的日志都是NPE。 所以我只是想知道如何检查联系人有图像。我试着用这种方式

    public String getPhotoUri(String contactId) {
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId));
    InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(mContext.getContentResolver(),uri);
    if (null !=is){
        return uri+"";
    }else {
        //TODO
    }
    return uri + "";
}

但ContactsContract.Contacts.openContactPhotoInputStream只是在系统联系人数据库上进行联系查询。所以,如果我想显示所有联系人照片。它会多次查询。那么有什么好方法可以检查联系人有图像吗?

1 个答案:

答案 0 :(得分:2)

方法1:
检索图像URI并检查它是否为NULL。

Cursor cur = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
String image_uri = "";

现在获取图片URI,

image_uri = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
if (image_uri != null) {  
  // set your image
} else {   // set default image
}

方法2:
尝试这样检索联系人照片:

public Uri getPhotoUri(int contactid) {
  Cursor photoCur = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'", null, ContactsContract.Contacts.DISPLAY_NAME+" COLLATE LOCALIZED ASC");
  photoCur.moveToPosition(contactid);
  Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, photoCur.getLong(photoCur.getColumnIndex(ContactsContract.Contacts._ID)));
  Uri photo = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
  return photo;
}

现在用它来设置图像,(contactimage是一个ImageView):

Uri contactphoto = getPhotoUri(contact_id);
contactimage.setImageURI(contactphoto);
if (contactimage.getDrawable() == null) {  // If no image is found.
   contactimage.setImageResource(R.drawable.defaultImage);
}