Home » Android » state – Detecting outgoing call and call hangup event in android

state – Detecting outgoing call and call hangup event in android

Posted by: admin April 23, 2020 Leave a comment

Questions:

I have a requirement wherein I want to detect two kind of events related to Calls in Android

  1. Whenever an outgoing call is made, my application should get to know this along with the called number
  2. When the call is hanged up(due to success/failure), my application should get to know this along with the reason of hangup

Is this possible in Android?

How to&Answers:

You should create a BroadcastReceiver:

public class CallReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                TelephonyManager.EXTRA_STATE_RINGING)) {

                // Phone number 
                String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

                // Ringing state
                // This code will execute when the phone has an incoming call
        } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                TelephonyManager.EXTRA_STATE_IDLE)
                || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                        TelephonyManager.EXTRA_STATE_OFFHOOK)) {

            // This code will execute when the call is answered or disconnected
        }

    }
}

You should register you application to listen to these intents in the manifest:

<receiver android:name=".CallReciever" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
 </receiver>

Answer:

There is a simpler solution using only TelephonyManager and
PhoneStateListener.You don´t even have to register a BroadcastReceiver.

public class MyPhoneStateListener extends PhoneStateListener {

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            //Hangup
            case TelephonyManager.CALL_STATE_IDLE:
                break;
            //Outgoing
            case TelephonyManager.CALL_STATE_OFFHOOK:
                break;
            //Incoming
            case TelephonyManager.CALL_STATE_RINGING:
                break;
        }
    }
}

And to register it:

public static void registerListener(Context context) {
    ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(new MyPhoneStateListener(),
            PhoneStateListener.LISTEN_CALL_STATE);
}

Answer:

You need to create a receiver for the following intent actions:

  1. Outgoing call – ACTION_NEW_OUTGOING_CALL
  2. Call hangup – ACTION_PHONE_STATE_CHANGED