Метод PhoneStateListener onCallStateChanged для параметров «входящий номер» пуст в Android 9.0? - PullRequest
0 голосов
/ 04 марта 2019
@Override
public void onCallStateChanged(int state, String incomingNumber) {
    super.onCallStateChanged(state, incomingNumber);
    switch (state) {
        case TelephonyManager.CALL_STATE_RINGING:
            if (incomingNumber == null || "".equals(incomingNumber)) {
                return;
            }
            break;
    }
}

У меня одна и та же проблема ниже Android sdk27, я запускаю PhoneStateListener в PhoneService,

public  void startPhoneStateListener() {
    mTelManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    mTelManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}

, но я запускаю Сервис только в RootReceiver,не в MainActivity, когда я запускаю PhoneService в MainActivity, я исправил это.

  <receiver android:name=".receiver.RootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

, но это работает только под Android SDK 27, я понятия не имею об Android 9.0, кстати, я написал разрешение:

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

1 Ответ

0 голосов
/ 04 марта 2019

Согласно Изменения поведения для всех приложений в Android 9.0 :

Номера телефонов, связанные с входящими и исходящими вызовами, отображаются в трансляции состояния телефона , например, для входящих и исходящих вызовов и доступны из класса PhoneStateListener.Однако без разрешения READ_CALL_LOG поле номера телефона, которое предоставляется в PHONE_STATE_CHANGED трансляциях и через PhoneStateListener, остается пустым.

Вы должны запросить READ_CALL_LOGразрешение, если вам нужен номер входящего телефона.

Обратите внимание, что на этой же странице:

Для чтения чисел с onCallStateChanged() вам нужно только разрешение READ_CALL_LOG.Вам не нужно разрешение READ_PHONE_STATE.

...