Есть ли простой способ проверить, является ли входящий абонент контактом в Android?

Когда телефон Android получает вызов, он автоматически проверяет, существует ли вызов в его собственной базе данных контактов. Мне было интересно, есть ли простой способ получить доступ к этой информации. У меня есть PhoneStateListener, который выполняет определенные действия во время звонка, и я хочу проверить, есть ли входящий абонент в списке контактов.

Есть ли способ сделать это, не заходя в Контакты ContentProvider?


person gggritso    schedule 03.02.2010    source источник
comment
Могу я спросить, почему вы не хотите делать это через контент-провайдера? Прослушивание входящего вызова, получение номера, а затем проверка его наличия у поставщика контента кажется логичным способом сделать это?   -  person Donal Rafferty    schedule 03.02.2010
comment
Вы правы, это был бы достойный способ, однако я хочу избежать этого из-за сложностей, связанных с типом телефона. Поскольку пользователь может поместить номер телефона контакта в любую категорию (например, «Работа», «Другое» или даже пользовательскую), становится некрасиво пытаться искать совпадение по всем полям. Кроме того, необходимо стандартно отформатировать числа. Я пропустил что-то очень простое? Если нет, то лучше вообще держаться подальше от этого бардака.   -  person gggritso    schedule 03.02.2010
comment
Код от Кристофера ниже должен работать нормально, я использую что-то похожее для проверки исходящего номера, и он проверяет все поля без каких-либо задержек в обработке.   -  person Donal Rafferty    schedule 03.02.2010


Ответы (2)


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

Преобразование числа в имя (в данном случае до версии 2.0) в любом случае достаточно просто:

Uri uri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, Uri.encode(number));

String name = null;
Cursor cursor = context.getContentResolver().query(uri, 
                    new String[] { Phones.DISPLAY_NAME }, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
    name = cursor.getString(cursor.getColumnIndex(Phones.DISPLAY_NAME));
    cursor.close();
}
person Christopher Orr    schedule 03.02.2010
comment
Ага! Я знал, что где-то путаюсь с URI! Большое спасибо, это сработало как шарм. - person gggritso; 03.02.2010
comment
Да, этот URI провайдера выполняет все форматирование и сопоставление чисел за вас... не нужно об этом беспокоиться. - person Christopher Orr; 03.02.2010

Вот код для 2.0 и выше

    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Cursor cursor = resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null);        

    if (cursor != null && cursor.moveToFirst()) {
        String name = cursor.getString(0);
        cursor.close();
    } 
person JaapH    schedule 24.07.2010
comment
вместо PhoneLookup мы не можем просто использовать Phone? - person Terril Thomas; 27.08.2013