как выбрать уникальные контакты с андроида

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

ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                null, null, ContactsContract.Contacts.DISPLAY_NAME);
        // Find the ListView resource.
        mainListView = (ListView) findViewById(R.id.mainListView);

        // When item is tapped, toggle checked properties of CheckBox and
        // Planet.
        mainListView
                .setOnItemClickListener(new AdapterView.OnItemClickListener()
                {
                    public void onItemClick(AdapterView<?> parent, View item,
                            int position, long id)
                    {
                        ContactsList planet = listAdapter.getItem(position);
                        planet.toggleChecked();
                        PlanetViewHolder viewHolder = (PlanetViewHolder) item
                                .getTag();
                        viewHolder.getCheckBox().setChecked(planet.isChecked());
                    }
                });

        // Create and populate planets.
        planets = (ContactsList[]) getLastNonConfigurationInstance();
        // planets = new Planet[10];
        // planets.Add("asdf");
        ArrayList<ContactsList> planetList = new ArrayList<ContactsList>();
        String phoneNumber = null;
        String phoneType = null;

        count = cur.getCount();
        contacts = new ContactsList[count];

        if (planets == null)
        {
            if (cur.getCount() > 0)
            {
                planets = new ContactsList[cur.getCount()];
                int i = 0;
                //
                while (cur.moveToNext())
                {
                    String id = cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts._ID));
                    String name = cur
                            .getString(cur
                                    .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    if (Integer
                            .parseInt(cur.getString(cur
                                    .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
                    {
                        // Query phone here. Covered next
                        Cursor pCur = cr
                                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                        null,
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                + " = ?", new String[]
                                        { id }, null);

                        // WHILE WE HAVE CURSOR GET THE PHONE NUMERS
                        while (pCur.moveToNext())
                        {
                            // Do something with phones
                            phoneNumber = pCur
                                    .getString(pCur
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));

                            phoneType = pCur
                                    .getString(pCur
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

                            Log.i("Pratik", name + "'s PHONE :" + phoneNumber);
                            Log.i("Pratik", "PHONE TYPE :" + phoneType);
                        }
                        pCur.close();
                    }

                    planets = new ContactsList[]
                    { new ContactsList(name, phoneNumber) };

                    contacts[i] = planets[0];
                    planetList.addAll(Arrays.asList(planets));

                    i++;
                }
            }

этот код извлекает все контакты и помещает их в список. но я хочу уникальные контакты и только те, у которых нет телефона. как я могу это сделать?? есть ли способ передать какой-либо аргумент в запрос, чтобы выбрать только уникальные контакты???


person Saqib Abbasi    schedule 22.11.2012    source источник


Ответы (3)


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

String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
                + ("1") + "'";
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
                + " COLLATE LOCALIZED ASC";
cur = context.getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, projection, selection
                        + " AND " + ContactsContract.Contacts.HAS_PHONE_NUMBER
                        + "=1", null, sortOrder);// this query only return contacts which had phone number and not duplicated

Обновление 20.05.2020

  suspend fun fetchContacts(): ArrayList<FriendItem> {
        val list = ArrayList<FriendItem>()
        val uri: Uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
        val selection = ContactsContract.Contacts.HAS_PHONE_NUMBER
        val cursor: Cursor? = context.contentResolver.query(
            uri,
            arrayOf(
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone._ID,
                ContactsContract.Contacts._ID
            ),
            selection,
            null,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"
        )

        cursor?.let {
            val nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)
            val phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
            while (cursor.moveToNext()) {
                val info = FriendItem(
                    friendName = cursor.getString(nameIndex),
                    friendPhoneNumber = cursor.getString(phoneIndex)
                )
                list.add(info)
            }
            cursor.close()
        }
        return list
    }
person Trung Nguyen    schedule 22.11.2012
comment
@Puru: я использовал это на Android 2.2. - person Trung Nguyen; 19.11.2013
comment
@Jul: Есть ли решение для ICS и выше? - person Anand Savjani; 30.09.2015
comment
@NamTrung: Сэр, не могли бы вы опубликовать пример кода курсора внутри цикла while для доступа к DISPLAY_NAME и NUMBER - person Omkar Ghurye; 19.05.2020
comment
@NamTrung В моем случае следующий код не работает: while (cursor.moveToNext()) { final String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); final String mob = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); - person Omkar Ghurye; 19.05.2020

Это работает для меня, чтобы связаться с номером телефона. Здесь мы запрашиваем таблицу данных и используем документацию поставщика контактов CONTACT_ID.

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {

final String ORDER_BY = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY + " ASC";

    final String[] PROJECTION = {
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY,
            ContactsContract.CommonDataKinds.Phone.NUMBER
    };

return new CursorLoader(
                context,
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                PROJECTION,
                null,
                null,
                ORDER_BY
        );
}
person Prakash    schedule 22.04.2015

простой способ получить номера телефонов и имена контактов

// set as global
Set<string> phonenumbersList = new HashSet<string>();

            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
            while (phones.moveToNext())
            {
            String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

            //contact has name number and phonenumber does not exists in list
            if ( phoneNumber != null && name != null && !phonenumbersList.contains(phoneNumber)){ 
                planets = new ContactsList[]{ new ContactsList(name, phoneNumber) };

                phonenumbersList.add(phoneNumber);
                planetList.addAll(Arrays.asList(planets));
                planetList.Add(phoneNumber, name);
            }
            }
            phones.close();
person user1841306    schedule 22.11.2012
comment
я получаю номер телефона уже с моим кодом. я хочу выбрать уникальные контакты - person Saqib Abbasi; 22.11.2012
comment
не хочу повторов. один номер телефона приходит только один раз - person Saqib Abbasi; 22.11.2012
comment
но тогда у вас все равно могут быть дубликаты в именах, потому что у контакта может быть больше телефонных номеров, я отредактирую свой пост, дайте мне секунду - person user1841306; 22.11.2012
comment
да, у контакта может быть больше номеров, но у номера только одно имя. - person Saqib Abbasi; 22.11.2012
comment
хорошо, смотрите мое редактирование, в примере у вас нет повторяющихся телефонных номеров - person user1841306; 22.11.2012
comment
Я сделал hasset, который содержит все уже сохраненные номера телефонов. Прежде чем вставлять новый элемент в свой список, проверьте, есть ли номер телефона в хэш-наборе. поэтому у вас нет повторяющихся номеров - person user1841306; 22.11.2012
comment
@user1841306 user1841306 Сэр. Что, если кому-то нужно уникальное ограничение Composite для имени и номера телефона? - person Omkar Ghurye; 19.05.2020