Listen incoming calls through BroadcastReceiver, without PhoneStateIntentReceiver or PhoneStateListener

后端 未结 2 1180
面向向阳花
面向向阳花 2021-01-31 23:41

Is there any way to listen to incoming calls by extending BroadcastReceiver to listen to OS\'s broadcast,without using PhoneStateIntentReceiver or PhoneStateListener. Also pleas

相关标签:
2条回答
  • 2021-02-01 00:10

    Here is My demo for android unit test. You can refer to it.

    public interface ICallVerify {
        void onOutgoing(Context context, Intent intent);
        void onCallStateChange(Context context, Intent intent);
    }
    
    protected void setUpCallVerify(final ICallVerify callVerify) {  //listen ingoing and outgoing
        final CountDownLatch latch = new CountDownLatch(1);
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { //state change
                    Log.i(TAG, "outgoing call...");
                    callVerify.onOutgoing(context, intent);
                } else if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ // state changed
                    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                    if (state.equals("RINGING")) {
                        state += " number:" + intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    }
                    Log.i(TAG, "call state changed.... " + state);
                    callVerify.onCallStateChange(context, intent);
                }
            }
        };
    
        IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
        filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
        ContextUtils.getTargetContext().registerReceiver(receiver, filter);
    
        try {
            latch.await(5, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    

    Dont forget to add permissions

    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
    
    0 讨论(0)
  • 2021-02-01 00:13

    The action you have defined in your manifest is incorrect. this is an Action Intent that can be used to answer a call and not monitor incoming calls.

    You can use two broadcast receivers that listen to ACTION_PHONE_STATE_CHANGED and NEW_OUTGOING_CALL broadcast intents.

    The ACTION_PHONE_STATE_CHANGED will be received when there is a new incoming call, call answered or hangup (See the documentation for the EXTRAs received with this Intent).

    The NEW_OUTGOING_CALL will be received when there is a new outgoing call placed on your device.

    As for permissions, I think you got it about right in your manifest (I assume the RECORD_AUDIO permission is used for something else in your application)

    0 讨论(0)
提交回复
热议问题