Reputation: 743
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?
Upvotes: 34
Views: 30111
Reputation: 1373
This is an old question, no doubt. But it pops up as the first result on Google. Hence, I decided to add another useful method.
When the phone state is changed, the system sends the TelephonyManager.ACTION_PHONE_STATE_CHANGED
broadcast. This broadcast has an extra state that can be extracted using TelephonyManager.EXTRA_STATE
.
The extra state can have three alternatives:
EXTRA_STATE_IDLE
EXTRA_STATE_OFFHOOK
EXTRA_STATE_RINGING
You can design a broadcast receiver that will take care of all these:
public class PhoneStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
if (intent.getAction().equals(TelephonyManager.ACTION_CALL_STATE_CHANGED){
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE){
// No call currently active.
} else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING){
// A call is ringing
} else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK){
// Call has been answered.
}
}
}
}
You can read more about it here:
Note: The broadcast receiver will be triggered in background and as of Android O+, you cannot start a background service from a background process. Consider starting a foreground service with context.startForegroundService(intent)
. In the onStartCommand(...)
of the service, call startForeground(...)
. Otherwise, the system raise a fatal exception. However, below Android O, you can safely use context.startService(intent)
instead of startForegroundService(...)
.
Upvotes: 0
Reputation: 2746
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.
Upvotes: 33
Reputation: 1873
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?
Upvotes: 1
Reputation: 12548
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;
}
}
}
Upvotes: 60