Home » Android » java – How to know whether I am in a call on Android?

java – How to know whether I am in a call on Android?

Posted by: admin April 23, 2020 Leave a comment


I want to know whether I am in a call.

If I am in a call then start the service (service part is clear). How do I do this?

While attending the call I need to call the service… I am unaware of how to do this? Any help?

How to&Answers:

You need broadcast receiver …

In manifest declare broadcast receiver …

<receiver android:name=".PhoneStateBroadcastReceiver">
                <action android:name="android.intent.action.PHONE_STATE"/>     

Also declare uses-permission …

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

The broadcast receiver class …

package x.y;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneStateBroadcastReceiver extends BroadcastReceiver{

    public void onReceive(Context context, Intent intent) {

        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        telephonyManager.listen(new CustomPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE);



And one class to customize phone state listener…

package x.y;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class CustomPhoneStateListener extends PhoneStateListener {

    //private static final String TAG = "PhoneStateChanged";
    Context context; //Context to make Toast if required 
    public CustomPhoneStateListener(Context context) {
        this.context = context;

    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);

        switch (state) {
        case TelephonyManager.CALL_STATE_IDLE:
            //when Idle i.e no call
            Toast.makeText(context, "Phone state Idle", Toast.LENGTH_LONG).show();
        case TelephonyManager.CALL_STATE_OFFHOOK:
            //when Off hook i.e in call
            //Make intent and start your service here
            Toast.makeText(context, "Phone state Off hook", Toast.LENGTH_LONG).show();
        case TelephonyManager.CALL_STATE_RINGING:
            //when Ringing
            Toast.makeText(context, "Phone state Ringing", Toast.LENGTH_LONG).show();


TelephonyManager.getCallState() returns one of


If this fits your requirements, it’s much less code than Pied Piper’s more comprehensive solution.


You can only come to know call is coming but you can’t modify this. 🙁
see this
why 2.3 version of android does not hava android.permission.MODIFY_PHONE_STATE ? and what is the solution for this?