Эффективный способ загрузки контактов с изображением в Android

#java #android #uri #android-contentprovider #android-contacts

#java #Android #uri #android-contentprovider #android-контакты

Вопрос:

У меня есть следующий код для загрузки всех контактов с их изображениями

 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);
    }
 

все работает нормально, но слишком медленно, около 40 секунд для 1000 контактов, когда я комментирую часть загрузки изображения, это занимает 18 секунд, так как я могу загрузить uri изображения в том же запросе загрузки контакта, чтобы минимизировать время ожидания пользователя.

Комментарии:

1. Вы пытались загрузить изображение большого пальца?

Ответ №1:

Для отображения изображений контактов вы можете использовать Универсальную библиотеку загрузки изображений. Он отлично подходит для обработки нескольких изображений. Вы можете использовать изображение по умолчанию для первоначального отображения, и как только изображение контакта будет загружено, библиотека отобразит это изображение.

Вот как вы отображаете изображение в этой библиотеке:

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

где img — это изображение, ImageView — это изображение, в котором вы хотите отобразить это изображение, options — это объект DisplayImageOptions библиотеки UniversalImageLoader.

Комментарии:

1. Моя проблема заключается не в загрузке самого изображения, а в получении uri-адреса фотографии из базы данных контактов