通过照片获取联系人信息的有效方式

时间:2012-05-30 07:28:04

标签: android cursor contacts android-contacts

我想获得所有联系人的一些基本信息(我使用api lvl 8)。目前我使用此代码段

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;

}

并传递给自定义适配器(扩展baseadapter)。我使用以下方式获取联系人的照片:

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

我在手机上测试了2x联系人(有照片)。我花了大约10秒来获取第一个运行时的所有联系人。我尝试在应用程序设置中强制关闭并再次运行。这次需要大约2秒才能获得数据。所以我想知道获取联系信息的最有效方法。

我发现了一些类似的SO问题,但他们不需要照片。 contacts in android 我尝试使用光标和光标适配器,但我不知道在同一时间获取photo_uri +联系人姓名的查询。

编辑:我删除了所有getColumnIndex我可以退出循环并只投影我想要的列。性能更好(10s => 5s)。

我想知道的是什么: 更好的方式来查询信息并设置为我的ContactInfo模型或查询,同时获取名称,电话号码,电子邮件,照片以传递给游标适配器。

提前致谢

2 个答案:

答案 0 :(得分:2)

我已更改为CusorAdapter并使用“通讯录”应用中的ContactsPhotoLoader,效果得到改善。

答案 1 :(得分:0)

要获取联系信息,您必须使用Android Contact API。此外,你必须保持最低限度,你必须以不同的方式处理这个Api,对于API api低于API 4(1.6)和Android API 5(2.0)及更高版本:

我会为您提供一些有用的链接:

  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

    这也是一些类似于你的SO线程,必须对你有所帮助

  5. get contact info from android contact picker

    Getting a Photo from a Contact