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

Android 安卓:联系人列表有重复的名字,android,android-contentprovider,android-contacts,android-contentresolver,Android,Android Contentprovider,Android Contacts,Android Contentresolver,我有一个按顺序排列的联系人列表。但在我的联系人列表中,姓名与号码重复。我认为问题是因为联系人列表与不同的帐户同步 我用哈希映射检查。但当我使用哈希映射时,结果并没有按名称排序 private static final String[] PROJECTION = new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.Contacts.DISPLAY_NAME, C

我有一个按顺序排列的联系人列表。但在我的联系人列表中,姓名与号码重复。我认为问题是因为联系人列表与不同的帐户同步

我用哈希映射检查。但当我使用哈希映射时,结果并没有按名称排序

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();
    }
}
适配器

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

任何人都可以帮助避免名称上的重复。

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

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;
} 
公共静态列表getPhone(上下文){
List contactList=new ArrayList();
ContentResolver cr=context.getContentResolver();
字符串[]投影=新字符串[]{
Contacts contract.raw contacts.\u ID,
Contacts contract.Contacts.DISPLAY\u NAME,
ContactsContract.CommonDataTypes.Phone.PHOTO\u URI,
Contacts contract.CommonDataTypes.Phone.NUMBER,
ContactsContract.CommonDataTypes.Photo.CONTACT_ID};
Uri Uri=ContactsContract.CommonDataTypes.Phone.CONTENT\u Uri;
字符串筛选器=“”+Contacts Contacts.Contacts.HAS_PHONE_NUMBER+”>0和“+PHONE.TYPE+”=”+PHONE.TYPE_MOBILE;
字符串顺序=Contacts contract.Contacts.DISPLAY_NAME+“ASC”;//限制“+限制+“偏移量”+lastId+”;
游标phoneCur=cr.query(uri、投影、过滤器、null、顺序);
while(phoneCur.moveToNext()){
ContactDTO dto=新ContactDTO();
setName(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
dto.setMobileNo(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
dto.setPhotoUrl(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
dto.setContactId(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataTypes.Photo.CONTACT_ID));
联系人列表。添加(dto);
}
phoneCur.close();
返回联系人列表;
} 
其中ContactDTO是简单的POJO类

我认为问题是因为联系人列表与不同的同步 帐户

是的,您的联系人列表同步了多个帐户。您应该使用帐户类型筛选联系人:
contacts contract.commondatatypes.Phone.account\u type\u和\u DATA\u SET

您可以研究的帐户:

您看到重复的联系人,因为他们属于不同的帐户。例如,如果与Facebook、WhatsApp和Google帐户同步,相同的号码可能会显示3次。您可以在此处找到更多信息

这就是如何使用列contacts contract.raw contacts.ACCOUNT\u 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”“

您可以搜索聚合的
联系人,而不是所有原始联系人。这将只为您提供一个具有给定姓名的联系人(如在“联系人”应用程序中)。
示例(更改代码):


来源:

请从Uri发布完整的代码适配器。我们无法检索电子邮件地址。他们是否可以通过一次查询获得姓名、电话和电子邮件。
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();
    }
}