有没有办法用 2.3 的联系人照片填充列表视图? [复制]
Posted
技术标签:
【中文标题】有没有办法用 2.3 的联系人照片填充列表视图? [复制]【英文标题】:Is there a solution to populating a listview with contact photos for 2.3? [duplicate] 【发布时间】:2012-06-20 03:34:44 【问题描述】:可能重复:How do I display a contact's photo from the contact's id?
一个多星期以来,我一直在尝试使用我设备中的联系人照片在我的 ListView 中填充我的 ImageView,但无济于事。
对于 API 级别 10,是否有 完整的解决方案?
我的 LogCat 代码:
Why are my contact photos not displaying in listview?
** CustomAdapter 类:**
public class CustomAdapter extends ArrayAdapter<String>
Cursor c;
String TAG = "CustomAdapter";
private Context context = null;
ArrayList<String> elements = null;
private ArrayList<String> data = null;
public static String contactName;
public static int count = 0;
private ArrayList<Boolean> itemChecked = null;
public static List<String> messages;
public static List<String> contactID;
String body;
String phoneNumber;
public CustomAdapter(Context context, int type, ArrayList<String> elements)
super(context, type, elements);
data = elements;
this.elements = elements;
this.context = context;
// THIS IS SIMPLY A CLASS VIEW WILL HOLD DIFFERENT VIEWS OF YOUR ROW.
static class ViewHolder
public ImageView photo;
public TextView contact;
@Override
public View getView(final int position, View convertView, ViewGroup parent)
View rowView = convertView;
final ViewHolder holder;
if (rowView == null)
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// HERE I AM INFLATING LISTVIEW LAYOUT.
rowView = inflater.inflate(R.layout.contact_entry, null, false);
holder = new ViewHolder();
holder.photo = (ImageView) rowView.findViewById(R.id.iv_contactPic);
holder.contact = (TextView) rowView
.findViewById(R.id.contactEntryText);
rowView.setTag(holder);
// RETRIEVE LATEST CONTACTS WHO SENT SMS (for visual)
contactID = new ArrayList<String>();
contactID = elements;
String folder = "content://sms/inbox/";
Uri mSmsQueryUri = Uri.parse(folder);
contactID = new ArrayList<String>();
try
c = context.getContentResolver().query(
mSmsQueryUri,
new String[] "_id", "thread_id", "address", "date",
"body" , null, null, null);
if (c == null)
Log.i(TAG, "cursor is null. uri: " + mSmsQueryUri);
c.moveToFirst();
while (c.moveToNext())
phoneNumber = c.getString(0);
contactID.add(phoneNumber);
catch (Exception e)
// Log.e(TAG, e.getMessage());
finally
c.close();
else
holder = (ViewHolder) rowView.getTag();
if (holder != null)
// bind the data to the row views
holder.contact.setText(data.get(position));
holder.photo.setImageBitmap(getByteContactPhoto(contactID
.get(position)));
// SHOW CONTACT PHOTO IF IT EXISTS. IF NOT, DEFAULT (***NOT WORKING***)
Long l = Long.parseLong(contactID.get(position));
contactPhoto = loadContactPhoto(context.getContentResolver(), l);
if(contactPhoto == null)
holder.photo.setImageResource(R.drawable.ic_intel);
else
holder.photo.setImageBitmap(contactPhoto);
return rowView;
// end if
// GET CONTACT PHOTO
private static Bitmap loadContactPhoto(ContentResolver cr, long id)
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
if (input == null)
return null;
return BitmapFactory.decodeStream(input);
// end class
【问题讨论】:
你能从联系人中获取照片吗? @ChocoMan : “有完整的解决方案吗...?” - 所以基本上你希望有人为你编写代码?你试过什么?它在哪里失败?您在 logcat 中看到什么错误?发布您的代码和布局文件(如有必要),您可能会得到有用的答案。 查看此 [链接][1] [1]:***.com/questions/9513781/… 它可以帮助您。谢谢 @GAMA 你每次都忘记编辑问题的标签,请也这样做所以不必改进你的编辑,直接点击批准。 请查看 [链接][1] [1]:***.com/questions/9513781/… 它对您有帮助。谢谢 【参考方案1】:使用此代码从联系人中获取照片............
public static Bitmap loadContactPhoto(ContentResolver cr, long id)
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
// InputStream input = ContactsContract.Contacts.Photo
if (input == null)
return null;
return BitmapFactory.decodeStream(input);
【讨论】:
【参考方案2】:在sn-p中写到你想要的地方
// set the profile picture
ImageView profile = (ImageView) findViewById(R.id.display_contact_image);
Bitmap bitmap = loadContactPhoto(getContentResolver(), _id);
if(bitmap == null)
//Set default contact image
profile.setImageResource(R.drawable.default_contact_image);
else
profile.setImageBitmap(bitmap);
方法是
private static Bitmap loadContactPhoto(ContentResolver cr, long id)
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
if (input == null)
return null;
return BitmapFactory.decodeStream(input);
并分享您尝试过的代码....(从上周开始:)
【讨论】:
我更新了包含我的代码链接的问题。不过从你的方法来看,我只有一个问题。它不喜欢我的 CustomAdapter 类中的“getContentResolver()”。此外,我的 ImageView 属于同一类。 @ChocoMan 您的 CustomAdapter 类在哪里?您是否将活动上下文传递给您的 CustomAdapter?如果是,那么您可以使用 context.getContentResolver() 调用 getContentResolver()。并将 profile 替换为您在代码中使用的 holder.photo。 我更新了我的问题以显示我的适配器类。我已经应用了你的方法,但我的contactPhoto
仍然为空。我的课堂上也有背景。我是否应用了您所看到的所有内容?以上是关于有没有办法用 2.3 的联系人照片填充列表视图? [复制]的主要内容,如果未能解决你的问题,请参考以下文章