Search code examples
androidbroadcastreceiverphone-callphone-state-listener

TelephonyManager.CALL_STATE_IDLE calls more than one time


I have a class, a listener of Phone call state. in this, when the call is disconnected this line,

case TelephonyManager.CALL_STATE_IDLE:
Log.e(TAG, "CALL_STATE_IDLE");
break;

executes morethan one time. this affects my requirement badly. please help me if anybody knows this issue.

thanks in advance

 public class IncomingCallListener extends BroadcastReceiver
        {
            private Context mContext;
            private static final String TAG = "CustomBroadcastReceiver";
        @Override
        public void onReceive(Context context, Intent intent) 
        {
            mContext = context;
            TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
            CustomPhoneStateListener customPhoneListener = new   CustomPhoneStateListener();
            telephony.listen(customPhoneListener,   PhoneStateListener.LISTEN_CALL_STATE);
            Bundle bundle = intent.getExtras();
            String phoneNr= bundle.getString("incoming_number");

        }
        public class CustomPhoneStateListener extends PhoneStateListener
            {
                private static final String TAG = "CustomPhoneStateListener";

                @Override
                public void onCallStateChanged(int state, String incomingNumber) 
                {
                switch (state) 
                {
                    case TelephonyManager.CALL_STATE_RINGING:
                        if(!incomingNumber.equalsIgnoreCase(""))
                        {
                            Log.e(TAG, "CALL_STATE_RINGING");
                        }
                        break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.e(TAG, "CALL_STATE_OFFHOOK");
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.e(TAG, "CALL_STATE_IDLE");
                    break;
                default:
                    break;
                }
                super.onCallStateChanged(state, incomingNumber);
            }
        }       
    } 

Solution

  • I CHANGED A little....and this is working code...

    public class IncomingCallListener extends BroadcastReceiver
        {
            private Context mContext;
            private static final String TAG = "CustomBroadcastReceiver";
             TelephonyManager telephony;
             CustomPhoneStateListener customPhoneListener ;
            @Override
            public void onReceive(Context context, Intent intent) 
            {
                mContext = context;
                Bundle extras = intent.getExtras();
                if (extras != null) {
                    String state = extras.getString(TelephonyManager.EXTRA_STATE);
                    Log.w("DEBUG", state);
    
                        telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
                        customPhoneListener = new   CustomPhoneStateListener();
                        telephony.listen(customPhoneListener,   PhoneStateListener.LISTEN_CALL_STATE);
                        Bundle bundle = intent.getExtras();
                        String phoneNr= bundle.getString("incoming_number");
    
    
                }
    
    
            }
            public class CustomPhoneStateListener extends PhoneStateListener
            {
                private static final String TAG = "CustomPhoneStateListener";
                Handler handler=new Handler();
                @Override
                public void onCallStateChanged(int state, String incomingNumber) 
                {
                    switch (state) 
                    {
                    case TelephonyManager.CALL_STATE_RINGING:
                        if(!incomingNumber.equalsIgnoreCase(""))
                        {
                            //YOUR CODE HERE
    
                        }
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        //YOUR CODE HERE
    
                        break;
                    case TelephonyManager.CALL_STATE_IDLE:
                        //YOUR CODE HERE
                        break;
                    default:
                        break;
                    }
                    super.onCallStateChanged(state, incomingNumber);
                    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_NONE);
                }
    
    
            }       
        }