我只是使用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只是在系统联系人数据库上进行联系查询。所以,如果我想显示所有联系人照片。它会多次查询。那么有什么好方法可以检查联系人有图像吗?
答案 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);
}