Android: Проверить номер телефона в списке контактов? (Номер телефона извлекается из телефонного звонка) - PullRequest
16 голосов
/ 17 августа 2010

Я делаю BroadcastReceiver для получения номера телефона человека, который мне звонит

<intent-filter>
<action
    android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
  1. Как проверить, есть ли номер телефона в моем списке контактов?
    У вас есть совет, чтобы узнать, существует ли этот номер телефона в списке контактов без загрузки списка контактов?
    Я не хочу больше информации, только если этот номер телефона существует.

  2. Если это невозможно, и я должен загрузить список контактов, как это сделать на BroadcastReceiver?
    Когда я пытаюсь сделать getContentResolver, это не работает, потому что я на BroadcastReceiver, а не внутри Activity ...

Спасибо за вашу помощь

Ответы [ 4 ]

33 голосов
/ 17 августа 2010
public boolean contactExists(Context context, String number) {
/// number is the phone number
Uri lookupUri = Uri.withAppendedPath(
PhoneLookup.CONTENT_FILTER_URI, 
Uri.encode(number));
String[] mPhoneNumberProjection = { PhoneLookup._ID, PhoneLookup.NUMBER, PhoneLookup.DISPLAY_NAME };
Cursor cur = context.getContentResolver().query(lookupUri,mPhoneNumberProjection, null, null, null);
try {
   if (cur.moveToFirst()) {
      return true;
}
} finally {
if (cur != null)
   cur.close();
}
return false;
}
9 голосов
/ 04 марта 2011

Я думаю, важно сказать, что вам нужно добавить следующее в ваш файл манифеста.

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
3 голосов
/ 06 марта 2011

Я предлагаю вам использовать Phone.CONTENT_FILTER_URI вместо PhoneLookup.CONTENT_FILTER_URI потому что PhoneLookup может быть пустым, и время от времени вы не получите никакого результата (проверено на LG-P500, froyo)

Проблема на моем устройстве возникает, например, когда:

  1. переключиться в режим полета
  2. использовать приложение для отправки сообщений по умолчанию для отправки смс (будет поставлено в очередь).
  3. используйте PhoneLookup.CONTENT_FILTER_URI для запроса контакта

Не все устройства подвержены уязвимости

Используя PhoneLookup.CONTENT_FILTER_URI, возвращаемый курсор всегда пуст. Используя Phone.CONTENT_FILTER_URI все в порядке (вы найдете контакт, если есть).

Поэтому я предлагаю вам всегда использовать Phone.* Uris, за исключением случаев, когда вам действительно нужно использовать PhoneLookup.* ... Обычно это просто вещи, связанные с синхронизацией адресной книги (и в большинстве случаев это не то, что вас интересует) .

3 голосов
/ 17 августа 2010

для 1 вы должны взглянуть на рекомендуемый ContactsContract.PhoneLookup провайдера

Таблица, которая представляет результат поиска номера телефона, например, для идентификации вызывающего абонента. Чтобы выполнить поиск, вы должны добавить номер, который вы хотите найти, к CONTENT_FILTER_URI. Этот запрос высоко оптимизирован.

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor mycursor=resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,...
if (mycursor!=null && mycursor.moveToFirst()) {
// record exists
}

для 2 вы можете использовать context из метода onReceive для вызова методов, которые относятся к Context

ContentResolver cr=context.getContentResolver();
...