Несколько раз показаны контакты в моем приложении из телефонной книги - PullRequest
0 голосов
/ 21 января 2019

Я получаю один и тот же контакт три или два раза в моем приложении, это происходит с некоторыми контактами, а не с каждым контактом.В моем приложении все работает, как и ожидалось, но при нажатии на кнопку показать контакт из моего он показывает три раза тот же контакт, но в мобильном телефоне контакт сохраняется только один раз.Я попробовал все со своей стороны, но не смог решить эту проблему, может ли кто-нибудь, пожалуйста, помогите мне.Или есть какой-то альтернативный способ для того же.

Вот мой код: -

    @Override
protected Integer doInBackground(Void... params) {


    try {


        db = new WhooshhDB(myContext);
        this.list = new ArrayList<>();

        ContentResolver cr = myContext.getContentResolver();

        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
        if ((cur != null ? cur.getCount() : 0) > 0) {

            while (cur != null && cur.moveToNext()) {

                String id = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur.getString(cur.getColumnIndex(
                        ContactsContract.Contacts.DISPLAY_NAME));

                if (cur.getInt(cur.getColumnIndex(
                        ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
                    Cursor pCur = cr.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                            new String[]{id}, null);
                    while (pCur.moveToNext()) {
                        String phoneNo = pCur.getString(pCur.getColumnIndex(
                                ContactsContract.CommonDataKinds.Phone.NUMBER));

                        ContactModel model = new ContactModel();

                        if (phoneNo.replaceAll("\\s", "").trim().length() > 7) {
                            model.name = name;
                            model.mobileNumber = phoneNo.replaceAll("\\s", "");
                            if (model.mobileNumber.contains("-")) {
                                model.mobileNumber = model.mobileNumber.replaceAll("-", "");
                            }
                            model.iconHexColor = AppConstant.getRandomSubscriptionHexColor(myContext);
                            if (!phoneNumber.equals(model.mobileNumber)) {
                                list.add(model);
                            }

                        }

                        Log.i("FetchContacts", "Name: " + name);
                        Log.i("FetchContacts", "Phone Number: " + phoneNo);
                    }
                    pCur.close();
                }
            }
        }
        if (cur != null) {
            cur.close();
        }

        return AppConstant.SUCCESS;
    } catch (Exception ex) {
        return null;
    }
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы распечатываете эти журналы «FetchContacts» для каждого контакта на телефон, поэтому, если для контакта сохранено несколько телефонов, вы увидите, что он напечатан несколько раз (даже если это один и тот же номер телефона).

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

Кроме того, это медленный и болезненный способ получения контактов с телефонами. Вместо этого вы можете просто запросить напрямую через Phones.CONTENT_URI и получить все телефоны в БД и сопоставить их с контактами по Contact-ID:

Map<String, List<String>> contacts = new HashMap<String, List<String>>();

String[] projection = { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER };
Cursor cur = cr.query(Phone.CONTENT_URI, projection, null, null, null);

while (cur != null && cur.moveToNext()) {
    long id = cur.getLong(0); // contact ID
    String name = cur.getString(1); // contact name
    String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234

    Log.d(TAG, "got " + id + ", " + name + ", " + data);

    // add info to existing list if this contact-id was already found, or create a new list in case it's new
    String key = id + " - " + name;
    List<String> infos;
    if (contacts.containsKey(key)) {
        infos = contacts.get(key);
    } else {
        infos = new ArrayList<String>();
        contacts.put(key, infos);
    }
    infos.add(data);
}

// contacts will now contain a mapping from id+name to a list of phones.
// you can enforce uniqueness of phones while adding them to the list as well.
0 голосов
/ 21 января 2019

Избавьтесь от

while (cur != null && cur.moveToNext()) { 

Измените его на

if(cur.moveToFirst()){
list.clear();
...