有没有办法用 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 的联系人照片填充列表视图? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Listview对点击的奇怪反应

使用 Baseadapter 时列表视图中的联系人图像重复

Android 2.3 和 Android 4.0 上的联系人照片 uri

用列表视图填充屏幕

Android - 检索联系人照片和显示

用数据填充视图中的表格视图,swift2