Android: проверьте номер телефона в списке контактов? (Номер телефона получен из телефонного звонка)

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

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

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

Спасибо за помощь

Ответы

Ответ 1

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;
}

Ответ 2

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

<uses-permission android:name="android.permission.READ_CONTACTS" /> 

Ответ 3

для 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();

Ответ 4

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

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

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

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

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

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