Получение идентификатора звонящего в Android 9

Я использовал следующий код в BroadcastReceiver чтобы получить идентификатор звонящего на входящие звонки:

@Override
public void onReceive(Context aContext, Intent aIntent) {
   String action = aIntent.getAction();

   if (action==null) return;
   if (!action.equals("android.intent.action.PHONE_STATE")) return;

   String curState = aIntent.getStringExtra(TelephonyManager.EXTRA_STATE);

   if ((TelephonyManager.EXTRA_STATE_RINGING.equals(curState))
      &&(TelephonyManager.EXTRA_STATE_IDLE.equals(oldState)))){
      String incNumber = aIntent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

      // do something here
   }
   oldState=curState;
}

К сожалению, это перестало работать в Android 9.0 (API 28), Более конкретно, aIntent.getStringExtra(EXTRA_INCOMING_NUMBER) всегда возвращает ноль. В андроид versions<=API 27 все работает правильно

Я также добавил READ_PHONE_STATE а также READ_CALL_LOG разрешения в файле манифеста.

Есть идеи? Кто-нибудь еще испытывает ту же проблему?

Заранее спасибо за помощь.

1 ответ

Я нашел ответ на свой вопрос:

Первый в Android 9, вы должны явно попросить оба READ_PHONE_STATE и READ_CALL_LOG разрешения во время выполнения. В предыдущих версиях Android вам нужно было только попросить READ_PHONE_STATE разрешение. Оба они должны быть заданы во время выполнения.

Во-вторых, если оба вышеуказанных разрешения были даны, onReceive метод вызывается дважды (!!). Первый раз, когда намерение "пусто" (EXTRA_INCOMING_NUMBER нулевой). Во второй раз намерение обычно заполняется как следует. Это задокументировано в Документации TelephonyManager.

Добавлять READ_CALL_LOG разрешение в манифесте, как показано ниже:

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

потом

Приложения -> Ваше приложение -> Разрешения -> Предоставить разрешение для журналов вызовов

Вы должны получить номер телефона сейчас, после второго раза receiver называется

Другие вопросы по тегам