Android : Duplicate contact data while retrieving

2019-06-23 16:15发布

问题:

I have gone through a lot of posts but didn't find any answer that answers the question efficiently or even correctly. The closest I came was this How to avoid duplicate contact name (data ) while loading contact info to listview? but this has too much overhead. Is there any simpler or more efficient way to solve this?

回答1:

I had the same problem you had: I was getting duplicate phone numbers. I solved this problem by obtaining the normalized number for each cursor entry and using a HashSet to keep track of which numbers I'd already found. Try this:

private void doSomethingForEachUniquePhoneNumber(Context context) {
    String[] projection = new String[] {
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER,
            //plus any other properties you wish to query
    };

    Cursor cursor = null;
    try {
        cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
    } catch (SecurityException e) {
        //SecurityException can be thrown if we don't have the right permissions
    }

    if (cursor != null) {
        try {
            HashSet<String> normalizedNumbersAlreadyFound = new HashSet<>();
            int indexOfNormalizedNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER);
            int indexOfDisplayName = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
            int indexOfDisplayNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

            while (cursor.moveToNext()) {
                String normalizedNumber = cursor.getString(indexOfNormalizedNumber);
                if (normalizedNumbersAlreadyFound.add(normalizedNumber)) {
                    String displayName = cursor.getString(indexOfDisplayName);
                    String displayNumber = cursor.getString(indexOfDisplayNumber);
                    //haven't seen this number yet: do something with this contact!
                } else {
                    //don't do anything with this contact because we've already found this number
                }
            }
        } finally {
            cursor.close();
        }
    }
}


回答2:

After API 21 We Write this Query for remove contact duplicacy.

String select = ContactsContract.Data.HAS_PHONE_NUMBER + " != 0 AND " + 
ContactsContract.Data.MIMETYPE
            + " = " + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + " 
AND "+ ContactsContract.Data.RAW_CONTACT_ID + " = " + 
ContactsContract.Data.NAME_RAW_CONTACT_ID;

Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, select, 
null, null);


回答3:

    ContentResolver cr = this.getContentResolver();
    String[] FieldList = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER,ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
    Cursor c = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,FieldList,
            null,null,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
    String name,phone,ContactID;
    HashSet<String> normalizedNumbers = new HashSet<>();
    if(c!=null)
    {
        while(c.moveToNext()!=false)
        {
            phone = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER));
            if(normalizedNumbers.add(phone)==true)
            {

                name = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                ContactID = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
                MyContacts m = new MyContacts(name,phone,ContactID);
                ContactList.add(m);
            }

        }
        c.close();