@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"/>
答案 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
权限。