在android中加载图像联系人的有效方法

时间:2014-06-25 03:53:34

标签: java android uri android-contentprovider android-contacts

我有以下代码用图片

加载所有联系人
public static void getAllContactWithNumberAndNameAndPhoto(Context context,
            ArrayList<ContactInfo> mContactList, boolean starred) {

        ContentResolver cr = context.getContentResolver();

        Cursor cur = null;
        if (starred == true) {
            cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                    "starred=?", new String[] { "1" }, null);
        } else {

            cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null,
                    null, null);
        }
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {

                ContactInfo item = new ContactInfo();
                String id = cur.getString(cur
                        .getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur
                        .getString(cur
                                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                // Uri photo = PhoneUtils.getPhotoUriFromID(context, id);
                String starredValue = cur.getString(cur
                        .getColumnIndex(ContactsContract.Contacts.STARRED));
                boolean isFav = false;
                if (starredValue.equals("1"))
                    isFav = true;

                if (Integer
                        .parseInt(cur.getString(cur
                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    Cursor pCur = cr.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + " = ?", new String[] { id }, null);
                    while (pCur.moveToNext()) {

                        String phoneNo = pCur
                                .getString(pCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        item.addPhone(removeCharactersFromPhoneNumber(phoneNo));
                    }
                    pCur.close();

                    // if (photo != null) {
                    //
                    // item.setPhoto(photo.toString());
                    // }

                    item.setName(name);
                    item.setFavorite(isFav);
                    item.setRecent(false);

                    mContactList.add(item);
                }
            }
            cur.close();
        }
    }

和以下代码加载联系人图片Uri

public static Uri getPhotoUriFromID(Context context, String id) {
        try {
            Cursor cur = context
                    .getContentResolver()
                    .query(ContactsContract.Data.CONTENT_URI,
                            null,
                            ContactsContract.Data.CONTACT_ID
                                    + "="
                                    + id
                                    + " AND "
                                    + ContactsContract.Data.MIMETYPE
                                    + "='"
                                    + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
                                    + "'", null, null);
            if (cur != null) {
                if (!cur.moveToFirst()) {
                    return null;
                }
            } else {
                return null;
            }
            cur.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        Uri person = ContentUris.withAppendedId(
                ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
        return Uri.withAppendedPath(person,
                ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    }

每件事情都工作正常,但是对于1000次接触来说太慢了大约40秒,当我评论加载图像的部分需要18秒时,那么如何在加载联系人的同一查询中加载图像uri以最小化等待时间用户。

1 个答案:

答案 0 :(得分:2)

要显示联系人的图像,您可以使用Universal Image Loader库。它非常适合处理多个图像。您可以使用默认图像进行初始显示,加载联系人图像后,图书馆将显示该图像。

这是您在此库中显示图像的方式:

ImageLoader.getInstance().displayImage(img, imageView, options);

其中img是图像,imageView是要显示该图像的ImageView,options是UniversalImageLoader库的DisplayImageOptions对象。