安卓:联系人列表有重复的姓名

6

我有一个按照排序方式排列的联系人列表,但是在我的列表中,同一个号码下的名字重复出现。我认为这个问题是因为该联系人列表与不同帐户同步导致的。

我使用了哈希映射来解决这个问题。但是当我使用哈希映射时,结果并没有按照名字排序。

private static final String[] PROJECTION = new String[] {
    ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.CommonDataKinds.Phone.NUMBER
};

ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION,
  null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");

if (cursor != null) {
    try {
        int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        String nameContact = cursor.getString(nameIndex);
    finally {
        cursor.close();
    }
}

Adapter

holder.name.setText(itemListPogo.get(position).getItemName());

请问有谁能帮忙避免名称重复的问题。


请发布完整的代码适配器。 - Quang Doan
4个回答

7
您看到重复的联系人是因为它们属于不同的帐户,例如:如果一个号码与 Facebook、WhatsApp 和 Google 帐户同步,则同一号码可能显示3次。您可以在此处找到更多信息:Android 账户管理器 以下是如何使用列 ContactsContract.RawContacts.ACCOUNT_TYPE 来筛选并检索仅与单个帐户关联的联系人。
String[] projection = new String[] {
                    ContactsContract.RawContacts._ID,
                    ContactsContract.RawContacts.ACCOUNT_TYPE,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.PHOTO_URI,
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    ContactsContract.CommonDataKinds.Photo.CONTACT_ID };


            String selectionFields =  ContactsContract.RawContacts.ACCOUNT_TYPE + " = ?";
            String[] selectionArgs = new String[]{"com.google"};

            Cursor cursor =  getContentResolver().query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    projection,
                    selectionFields,
                    selectionArgs,
                    ContactsContract.Contacts.DISPLAY_NAME
            );

在这段代码中,只选择与 Google 账户相关联的联系人。同样地,如果您想获取 WhatsApp 联系人列表,只需将 "com.google" 替换为 "com.whatsapp"

太好了@Zain,我现在能够过滤谷歌联系人了,你知道如果设备上有多个谷歌账户,如何在特定的谷歌账户上进行过滤吗? - safi

5

我建议你使用我搜索到的地方,它将为您提供最快的结果。

public static List<ContactDTO> getPhone(Context context) {
    List<ContactDTO> contactList = new ArrayList<ContactDTO>();
    ContentResolver cr = context.getContentResolver(); 
    String[] PROJECTION = new String[] { 
        ContactsContract.RawContacts._ID, 
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.PHOTO_URI,
        ContactsContract.CommonDataKinds.Phone.NUMBER,
        ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String filter = ""+ ContactsContract.Contacts.HAS_PHONE_NUMBER + " > 0 and " + Phone.TYPE +"=" + Phone.TYPE_MOBILE;     
    String order = ContactsContract.Contacts.DISPLAY_NAME + " ASC";// LIMIT " + limit + " offset " + lastId + "";

    Cursor phoneCur = cr.query(uri, PROJECTION, filter, null, order);
    while(phoneCur.moveToNext()) {
        ContactDTO dto = new ContactDTO();
        dto.setName("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
        dto.setMobileNo("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
        dto.setPhotoUrl("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)));
        dto.setContactId("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.CONTACT_ID)));
        contactList.add(dto);
    }
    phoneCur.close();

    return contactList;
} 

这里的ContactDTO是一个简单的POJO类。


从Uri中我们无法检索电子邮件地址。有没有办法在一个查询中获取姓名、电话和电子邮件? - blackjack

0
您可以搜索聚合联系人而不是所有原始联系人。这将仅提供一个具有给定名称的联系人(就像在联系人应用程序中一样)。 示例(更改您的代码):
private static final String[] PROJECTION = new String[] {
    ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, // Honeycomb+ should use this
    ContactsContract.CommonDataKinds.Phone.NUMBER
};

ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(
    ContactsContract.Contacts.CONTENT_URI, 
    PROJECTION, 
    null, 
    null, 
    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " COLLATE NOCASE ASC");

if (cursor != null) {
    try {
        int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY);
        String nameContact = cursor.getString(nameIndex);
    finally {
        cursor.close();
    }
}

来源:https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接