How to know whether I am in a call on Android?
You need broadcast receiver ...
In manifest declare broadcast receiver ...
<receiver android:name=".PhoneStateBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE"/> </intent-filter></receiver>
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{ @Override 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) { super(); this.context = context; } @Override 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(); break; 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(); break; case TelephonyManager.CALL_STATE_RINGING: //when Ringing Toast.makeText(context, "Phone state Ringing", Toast.LENGTH_LONG).show(); break; default: break; } }}
TelephonyManager.getCallState()
returns one of
CALL_STATE_IDLE
CALL_STATE_OFFHOOK
CALL_STATE_RINGING
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?