Effective way to get contacts info with photo

2019-07-31 23:20发布

问题:

I want to get some basic info of all contacts(I use api lvl 8). Currently i use this code snippet

private List<ContactInfo> readContacts() {

    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, Phone.DISPLAY_NAME + " ASC");

    for (int i = 0; i < cur.getColumnCount(); i++) {

        Log.v("COlum", cur.getColumnName(i));

    }
    List<ContactInfo> temp = new ArrayList<ContactInfo>();
    if (cur.getCount() > 0) {

        while (cur.moveToNext()) {
            ContactInfo mContactInfo = new ContactInfo();
            String id = cur.getString(cur
                    .getColumnIndex(ContactsContract.Contacts._ID));
            mContactInfo.setId(Long.parseLong(id));
            String name = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            if (Integer
                    .parseInt(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                mContactInfo.setmDisplayName(name);

                // get the <span class="IL_AD" id="IL_AD7">phone
                // number</span>
                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?", new String[] { id }, null);
                while (pCur.moveToNext()) {
                    String phone = pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                    mContactInfo.setmPhoneNumber(phone);
                }
                pCur.close();

                // get email and type

                Cursor emailCur = cr.query(
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                + " = ?", new String[] { id }, null);
                while (emailCur.moveToNext()) {
                    // This would allow you get several email <span
                    // class="IL_AD" id="IL_AD9">addresses</span>
                    // if the email addresses were stored in an array
                    String email = emailCur
                            .getString(emailCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                    mContactInfo.setmEmail(email);
                }
                emailCur.close();

                temp.add(mContactInfo);
            }
        }
    }
    return temp;

}

and pass to custom adapter (extended baseadapter). I get contact's photo using:

public static Bitmap loadContactPhoto(ContentResolver cr, long id) {
        Uri uri = ContentUris.withAppendedId(
                ContactsContract.Contacts.CONTENT_URI, id);
        InputStream input = openContactPhotoInputStream1(cr, uri);
        if (input == null) {
            return null;
        }
        return BitmapFactory.decodeStream(input);
}

I tested on my phone with 2x contacts (had photo). I took ~ 10s to fetch all contact at 1st runtime. I try force close in application settings and run again. This time it took ~2s to get data.So i want to know the most effective way to get contacts info.

I found some similar SO questions but they dont need photo. contacts in android I tried use cursor and cursor adapter but i dont know what query to get photo_uri + contact name at the same time.

Edit: i removed all getColumnIndex i can out of loop and project only column i want. The performance is better(10s => 5s).

What i want to know : Better way to query info and set to my ContactInfo model or the query which get name, phone number, email, photo at the same time to pass to cursor adapter.

Thanks in advance

回答1:

I changed to CusorAdapter and use ContactsPhotoLoader from Contacts app and performance is improved.



回答2:

To get contact info you have to work with the Android Contact API. Also you have to keep in min that you have to handle this Api in a different way for android api below API 4 (1.6)and for the Android API 5 (2.0) and higher:

I will provide you some good links that will help you:

  1. Working With Android Contacts
  2. Handling Contact Photos (All API Levels)
  3. Using the Contact Picker API 2.0 and above
  4. Retrieving Contact Information (Name, Number, and Profile Picture) API4 and lower

    Thes also some SO thread similar to yours that must b helpful for you

get contact info from android contact picker

Getting a Photo from a Contact