Android 9.0中的PhoneStateListener onCallStateChanged方法参数“传入号码”为空吗?

时间:2019-03-04 06:07:02

标签: android phone-state-listener

@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下遇到同样的问题,我在PhoneService中启动PhoneStateListener,

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

但是我只能在RootReceiver中启动Service,而不能在MainActivity中启动Service,当我在MainActivity中启动PhoneService时,我对其进行了修复。

  <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 :(得分:2)

按照Behavior Changes for all apps in Android 9.0

  

与来电和去电相关的电话号码在phone state broadcast中可见,例如来电和去电,并且可以从PhoneStateListener类访问。但是,未经READ_CALL_LOG许可,PHONE_STATE_CHANGED中广播的和通过PhoneStateListener提供的电话号码字段为空。

如果要输入电话号码,必须请求READ_CALL_LOG权限。

请注意,在同一页面上

  

要从onCallStateChanged()中读取数字,您仅需要READ_CALL_LOG权限。您不需要READ_PHONE_STATE权限。