1

我想获取所有联系人的一些基本信息(我使用 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 秒的时间在第一次运行时获取所有联系人。我尝试在应用程序设置中强制关闭并再次运行。这次花了~2s来获取数据。所以我想知道获取联系人信息的最有效方法。

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

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

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

提前致谢

4

2 回答 2

2

我从 Contacts 应用程序更改为CusorAdapter并使用ContactsPhotoLoader并提高了性能。

于 2012-06-29T10:27:38.273 回答
0

要获取联系信息,您必须使用 Android Contact API。此外,您必须记住,对于 API 4 (1.6) 以下的 android api 和 Android API 5 (2.0) 及更高版本,您必须以不同的方式处理此 Api:

我将为您提供一些对您有帮助的好链接:

  1. 使用 Android 联系人
  2. 处理联系人照片(所有 API 级别)
  3. 使用 Contact Picker API 2.0 及更高版本
  4. 检索联系信息(姓名、号码和头像)API4 及更低版本

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

从 android 联系人选择器获取联系人信息

从联系人获取照片

于 2012-05-30T08:48:28.347 回答