Извлечение контактов, когда установлен WhatsApp дает дублированные записи

Я выбираю контакты с Android и сохраняю их в базе данных. Протестировал его на эмуляторе, и он работал. Но когда я тестировал приложение на своем телефоне, я получил дубликаты записей контактов, которые использовали Whatsapp. Ниже приведен фрагмент кода.

class LoadContactAsync extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        Cursor people = getContentResolver()
                .query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
                        "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
                                + ") ASC");
        while (people.moveToNext()) {
            final String contactId = people.getString(people
                    .getColumnIndex(ContactsContract.Contacts._ID));
            final String contactName = people
                    .getString(people
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            final String image_uri = people
                    .getString(people
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
            final String hasPhone = people
                    .getString(people
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
            if ((Integer.parseInt(hasPhone) > 0)) {
                Cursor phones = getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null,
                        "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
                while (phones.moveToNext()) {
                    final String phoneNumber = phones
                            .getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    db.addContact(new Contact(contactName, phoneNumber, image_uri));
                }
                phones.close();
            }
        }
        people.close();
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        pd.dismiss();
        showToast("Contacts Added Successfully");
        db.close();
    }

    @Override
    protected void onPreExecute() {
        pd = ProgressDialog.show(MainActivity.this, "Please Wait...",
                "Fetching One Time Contacts", true, false);
    }
}

Вот скриншот

Без установленного WhatsApp

Без установленного WhatsApp

С установленным WhatsApp

С установленным WhatsApp

Любая помощь будет оценена. Спасибо

3 ответа

Решение

Для кого-то, кто может столкнуться с той же ошибкой.. Это помогло мне. Сделать столбец Номер телефона как unique в вашей таблице базы данных..

@Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT UNIQUE," + KEY_IMAGE + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

Если вы не хотите использовать базу данных, чтобы избежать повторяющихся записей, используйте код ниже

    private HashMap<String, ContactModel> getContactsList() {
    String[] projection = new String[]{ContactsContract.Contacts._ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.PHOTO_URI};
    Cursor phones = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");


    String lastPhoneName = " ";
    if (phones.getCount() > 0) {
        while (phones.moveToNext()) {
            String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            String contactId = phones.getString(phones.getColumnIndex(ContactsContract.Contacts._ID));
            String photoUri = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
            if (!name.equalsIgnoreCase(lastPhoneName)) {
                lastPhoneName = name;
                contactDetail.put(contactId, new ContactModel(contactId, name, phoneNumber, photoUri));
                Log.d("getContactsList", name + "---" + phoneNumber + " -- " + contactId + " -- " + photoUri);
            }
        }
    }
    phones.close();

    return contactDetail;
}

Хранить все контактные данные в одном массиве (включая дубликаты),

ArrayList mDetailsArrayList = new ArrayList<> ();

затем в postExecute удалите дублирующиеся записи, используя метод removeDuplicates();

private ArrayList<Contact> removeDuplicate(ArrayList<Contact> contactArrayList){


    Set set = new TreeSet(new Comparator() {
        @Override
        public int compare(Object lhs, Object rhs) {

            if (lhs instanceof Contact && rhs instanceof Contact) {

                if (((Contact) lhs).getContactName().equalsIgnoreCase(((Contact) rhs).getContactName())) {
                    return 0;
                }
            }
            return 1;
        }
    });
    set.addAll(contactArrayList);

    System.out.println("\nAfter removing duplicates\n");

    final ArrayList newList = new ArrayList(set);

    System.out.println(set);

    return newList;
}

Теперь этот возвращенный список массивов будет содержать реальные данные

Другие вопросы по тегам