Android - How to detect outgoing call is answered or received?

后端 未结 3 2062
不思量自难忘°
不思量自难忘° 2021-02-10 03:57

Is there any way to detect outgoing call is successfully received or answered ? I am using Intent.ACTION_CALL for dialing a call and PhoneCallListener

3条回答
  •  暗喜
    暗喜 (楼主)
    2021-02-10 04:37

    I know its been a while but i hope to be helpful for someone still looking for a solution!

    I recently had to work on a similar project where i needed to capture the ringing state of an outgoing call and the only way i could find was using the hidden Api of native dial-up App. This would only be possible for android > 5.0 because of the api changes. This was tested on Android 5.0.1, and worked like a charm. (p.s. you would need a rooted device for it to work, because you need to install your app as a System application (google how!) which will then be able to detect the outgoing call states).

    For the record, PhoneStateListener doesn't work for detecting the outgoing call states as mentioned in many posts.

    First, add this permission in the manifest file,

    Then define you broadcastreceiver, (here is a sample code!)

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.TelephonyManager;
    
    public class MyBroadcastReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, final Intent intent)
        {
            switch (intent.getIntExtra("foreground_state", -2)) {
                case 0: //  PreciseCallState.PRECISE_CALL_STATE_IDLE:
                    System.out.println("IDLE");
                    break;
                case 3: //  PreciseCallState.PRECISE_CALL_STATE_DIALING:
                    System.out.println("DIALING");
                    break;
                case 4: //  PreciseCallState.PRECISE_CALL_STATE_ALERTING:
                    System.out.println("ALERTING");
                    break;
                case 1: //  PreciseCallState.PRECISE_CALL_STATE_ACTIVE:
                    System.out.println("ACTIVE");
                    break;
            }
    
        }
    } 
    

    I replaced some of the constants with their values because i saw a lot of confusion among the folks unfamiliar with the concept of reflection (so for ease). Alerting is basically the state when receiver is actually ringing! and that does not include the call setup time which means that the call has been received successfully!. There are other options in precise_call_state class (which i didn't explore), to help you with capturing the call being answered!

提交回复
热议问题