maveric maveric - 10 months ago 74
Android Question

Missed call detection in android

I want to develop a missed call detector .Which notify through broadcast reciver I found the code from the following link

public abstract class PhoneCallReceiver extends BroadcastReceiver {
static CallStartEndDetector listener;

public void onReceive(Context context, Intent intent) {
savedContext = context;
if(listener == null){
listener = new CallStartEndDetector();

TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

public class CallStartEndDetector extends PhoneStateListener {
int lastState = TelephonyManager.CALL_STATE_IDLE;
boolean isIncoming;

public PhonecallStartEndDetector() {}

//Incoming call- IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when hung up
//Outgoing call- from IDLE to OFFHOOK when dialed out, to IDLE when hunged up

public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if(lastState == state){
//No change
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
isIncoming = true;
//incoming call started
case TelephonyManager.CALL_STATE_OFFHOOK:
//Transition of ringing->offhook are pickups of incoming calls. Nothing down on them
if(lastState != TelephonyManager.CALL_STATE_RINGING){
isIncoming = false;
//outgoing call started
case TelephonyManager.CALL_STATE_IDLE:
//End of call(Idle). The type depends on the previous state(s)
if(lastState == TelephonyManager.CALL_STATE_RINGING){
//toast here for missed call
else if(isIncoming){
//incoming call ended
//outgoing call ended
lastState = state;



The above code woking fine .But when i got the missed call from same no it repeat the missed call detection . How i will got the toast only once please help

Answer Source

Hi everyone I have got the solution now its working fine with missed call.

Here my Class code MyCallListener extended by BroadcastReciever

private static boolean ring=false;
private static boolean callReceived=false;
private String callerPhoneNumber;
private Context saveContext;

public void onReceive(Context mContext, Intent intent)
   // Get the current Phone State

    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);


    Bundle bundle = intent.getExtras();
    number= bundle.getString("incoming_number");
    Calendar calendar=Calendar.getInstance();
    // If phone state "Rininging"
              ring =true;
             // Get the Caller's Phone Number


     // If incoming call is received

     // If phone is Idle
    if (state.equals(TelephonyManager.EXTRA_STATE_IDLE))
              // If phone was ringing(ring=true) and not received(callReceived=false) , then it is a missed call
                        Toast.makeText(mContext, "missed call : "+number, Toast.LENGTH_LONG).show();

dont forgot to define receiver in manifest file

 <receiver android:name="" />

in the application tag