应用程式关闭时,intent.action.PHONE_STATE广播接收器无法运作

问题描述

我正在尝试通过此广播来检测来电

   <receiver android:name=".IncomingCallReceiver"
                android:enabled="true"
    
                android:exported="true">
                <intent-filter android:priority="2147483647">
                    <action android:name="android.intent.action.PHONE_STATE" />
                </intent-filter  >
                <intent-filter android:priority="2147483647">
                    <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
                </intent-filter>
            </receiver>

这是Java代码

public void onReceive(Context context,Intent intent) {

        if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
//            savednumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
        }
        else{
            String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
            String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            int state = 0;
            if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                state = TelephonyManager.CALL_STATE_IDLE;
            }
            else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
                state = TelephonyManager.CALL_STATE_OFFHOOK;
            }
            else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
                state = TelephonyManager.CALL_STATE_RINGING;
            }


            onMyCallStateChanged(context,state,number);
        }


//            TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//            telephony.listen(new PhonestateListener() {
//                @Override
//                public void onCallStateChanged(int state,String phoneNumber) {
//
//                    onMyCallStateChanged(context,phoneNumber);
//                }
//            },PhonestateListener.LISTEN_CALL_STATE);
        }

问题是当应用关闭或从最近广播中删除时,此广播无法正常工作。在Android docs中,提到它将在后台运行

解决方法

确保清单中有此内容。

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

否则,广播接收器将自动失败。