首页 > 解决方案 > Android 9.0 中的 PhoneStateListener onCallStateChanged 方法参数“传入号码”为空?

问题描述

@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 中启动服务,而不是在 MainActivity 中,当我在 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"/>

标签: androidphone-state-listener

解决方案


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

与呼入和呼出相关的电话号码在电话状态广播中可见,例如呼入和呼出,并且可以从PhoneStateListener类中访问。但是,未经许可READ_CALL_LOGPHONE_STATE_CHANGED广播和直通中提供的电话号码字段PhoneStateListener为空。

READ_CALL_LOG如果您想要传入的电话号码,您必须请求许可。

请注意,根据同一页面:

要从中读取数字onCallStateChanged(),您只需要获得READ_CALL_LOG许可。你不需要READ_PHONE_STATE权限。


推荐阅读