Android 9.0 中PhoneStateListener onCallStateChanged 方法参数“来电号码”为空?

问题描述 投票:0回答:2
@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"/>
android phone-state-listener
2个回答
5
投票

根据 Android 9.0 中所有应用程序的行为更改

与来电和去电相关的电话号码在 电话状态广播中可见,例如来电和去电,并且可以从

PhoneStateListener
类访问。但是,如果没有
READ_CALL_LOG
许可,
PHONE_STATE_CHANGED
广播和通过
PhoneStateListener
提供的电话号码字段将为空。

如果您想要传入电话号码,则必须请求

READ_CALL_LOG
许可。

请注意,根据同一页面:

要读取

onCallStateChanged()
中的数字,您只需要
READ_CALL_LOG
权限。您不需要
READ_PHONE_STATE
权限。


0
投票

我也遇到了同样的问题,我在清单文件中添加了 READ_CALL_LOG 和 READ_PHONE_STATE,但错过了在 MainActivity 中添加运行时权限,因此我在传入的电话号码中获取了空值。现在工作正常并正在获取传入的电话号码。 感谢大家

© www.soinside.com 2019 - 2024. All rights reserved.