Android: я пытаюсь найти контакты по их отображаемому имени

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

https://developer.android.com/training/contacts-provider/retrieve-names.html

В данном примере поиск осуществляется по всей контактной информации, присутствующей в контакте, а не только по имени контакта.

Например, если у пользователя есть адрес электронной почты в его контактах, то поиск выполняется и по этим адресам. или если номер хранится в домашнем типе, то при вводе h также отображается номер, присутствующий в домашней категории.

Я хочу, чтобы поиск был ограничен их отображаемым именем.

     final static String SELECTION =
            (Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME) +
                    "<>''" + " AND " + Contacts.IN_VISIBLE_GROUP + "=1";

Это предложение selecton, которое я использую, взятое из примера кода.


person Ritu Nagpal    schedule 06.12.2016    source источник


Ответы (2)


Попробуй это

Cursor cursor = getContentResolver().query(
            android.provider.ContactsContract.Contacts.CONTENT_URI,
            new String[] { ContactsContract.Contacts.PHOTO_ID,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.Contacts._ID },
            ContactsContract.Contacts.HAS_PHONE_NUMBER, null,
            ContactsContract.Contacts.DISPLAY_NAME);

Это cursor дает все контакты, у которых есть любой номер телефона, а затем я сохраняю уникальный ID в ArrayList, как это

cursor.moveToFirst();

    while (cursor.moveToNext()) {
        contactsID.add(cursor.getString(2));
    }

затем при выборе контакта я нахожу контактные номера, используя это

Cursor cursor = getContentResolver()
                    .query(android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            new String[] {
                                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME },
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + " = ?",
                            new String[] { contactsID.get(position) }, null);
            contactNumbers = new ArrayList<String>();
            while (cursor.moveToNext()) {
                contactNumbers.add(cursor.getString(0));
                Log.d("number", cursor.getString(0));
            }
person Ravish Sharma    schedule 06.12.2016
comment
Где использовать этот код? Вы проверили образец? - person Ritu Nagpal; 06.12.2016

Код, выполняющий фильтрацию в учебнике Retrieving a List of Contacts, находится здесь:

Uri contentUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mSearchString));

В документах Contacts.CONTENT_FILTER_URI говорится:

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

Так что это не хорошо для вас, замените его на:

@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
    Uri contentUri = Contacts.CONTENT_URI; // no longer filters
    String selection = Contacts.DISPLAY_NAME_PRIMARY + " LIKE %" + mSearchString + "%";

    return new CursorLoader(
            getActivity(),
            contentUri,
            PROJECTION,
            selection,
            null,
            null
    );
}
person marmor    schedule 20.12.2016