我有一个ListView,我想分别在ImageView和TextView中显示联系人图片和联系人姓名。我能够使用联系人姓名生成ListView,但是我遇到了图像问题。注意:我已在此处和网上阅读了数百篇帖子,并没有描述我找到的问题或可能的解决方案。
在访问照片的所有方法中,没有一个方法允许您使用ContactsContract.Contacts中的PHOTO_URI进行访问。所有方法都涉及访问联系人_ID,使用它来使用ContentUris.withAppendedId生成联系URI,然后使用它来生成InputStream等。
这是我的问题。 PHOTO_URI和contact_ID不匹配。例如:
约翰史密斯 Contact_ID = 905 PHOTO_URI = content://com.android.contacts/contacts/270/photo这导致几乎没有联系人照片甚至出现,实际上只有57个中有2个,而那些确实显示的是错误的联系人。也就是说,从上面的示例中,John的照片显示在Mark旁边,因为Mark的Contact_ID = 270。其他55个联系人没有任何照片显示,因为没有匹配的照片和ID,即使其中超过30个实际上有照片。
第二个问题是某些PHOTO_URI是不同的路径结构,例如 内容://com.android.contacts/display_photo/3
我在这里完全失败了。这是我的自定义适配器中的bindView()代码,它试图访问这些照片。
public void bindView(View view, Context context, Cursor cursor) {
ContentResolver cr = context.getContentResolver();
//cursor is contactsCursor from FriendsContactFragment
//{CONTACTS_ID, DISPLAY_NAME, PHOTO_URI, GROUP_ROW_ID, LOOKUP_KEY}
//get the ViewHolder object saved in newView()
ViewHolder viewHolder = (ViewHolder) view.getTag();
long contactId = cursor.getLong(0);
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
InputStream photoData = ContactsContract.Contacts.openContactPhotoInputStream(cr, contactUri);
Bitmap bm = BitmapFactory.decodeStream(photoData);
if(bm != null){
viewHolder.imageView.setImageBitmap(bm);
}else{
viewHolder.imageView.setImageResource(R.drawable.ic_friends_c);
}
//adding additional info to output for debugging
viewHolder.textView.setText(cursor.getString(1) + "\nCONTACT_ID: " + cursor.getString(0) + "\nCONTACT_URI: " + contactUri + "\nPHOTO_URI: " + cursor.getString(2) + "\nphotoData: " + photoData);
}