В одном из приложений встал вопрос поиска контакта по номеру телефона (при приёме SMS). Задача оказалось не такой уж простой – в базе контактов телефоны часто записываются в произвольном (удобном пользователю) формате: тут и использование 8 вместо кода страны, и скобки и/или пробелы для разделения частей номера. А тут еще оператор добавил своего креатива и номер автора SMS преобразовывал в более читаемый формат – код страны, код оператора и сам номер телефона разделяется пробелами. Своя функция приведения номеров к международному формату не справлялась добросовестно, да и времени это занимало слишком много. Поиск ответа в документации особых результатов тоже не дал, но помогло изучение исходников. Оказалось, что в SQLite запросах можно использовать функцию PHONE_NUMBERS_EQUAL(NUMBER1, NUMBER2, STRICT). Третий параметр можно опустить. Этот способ работает отлично.
String[] projection = new String[] { ContactsContract.Data.CONTACT_ID, ContactsContract.Contacts.LOOKUP_KEY, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.STARRED, ContactsContract.Contacts.CONTACT_STATUS, ContactsContract.Contacts.CONTACT_PRESENCE };
String selection = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'";
String selectionArgs = new String[] { phoneNumber };
Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, selection, selectionArgs, null);
Сам исходный номер желательно привести в более простой вид перед поиском:
String phoneNumber = PhoneNumberUtils.stripSeparators(sourcePhoneNumber);
Может быть кому-то поможет и сэкономит время и силы.
Автор: palmut