Phone number is set to null at the time of OFFHOOK state of TelephonyManager

Ekta picture Ekta · Sep 22, 2016 · Viewed 7.2k times · Source

I get a phone number at the time of the ringing state, but sometimes, it is set to null at the time of the off hook state. I can't catch the moment where it goes to null.

So, when a call comes (incoming call) it goes to RINGING STATE and the number is set to callno variable. After that when I pick up the call it goes to OFFHOOK STATE and I got null in callno therefore it gives me a NullPointerException.

How do I prevent this situation?

public class CallStateReceiver extends BroadcastReceiver {

private static boolean noCallListenerYet = true;
TelephonyManager telephonyManager;
static MyPhoneStateListener phoneListener;
private static Context context1;
Context context;
private int prevState;
String userId;
String incoming_number = null;
Bundle bundle;
String state;
private static String callno = null;
static SharedPreferences pref;
static int cidvalue;
/*Added to resolve the below bug:
 * Bug: At the time of call comes on poped up note and 
 *      below note was not send and new userid not 
 *      replace with older userid.
 */
private static boolean isOnReceive = false;

public static String getCallno() {
    return callno;
}

@Override
public void onReceive(Context context, Intent intent) {
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);


    isOnReceive = true;

    if( CallTrackerModel.isRecording() ){
    }else{

    CallTrackerModel.setCallId("");
    try{
        if (intent.getAction()
                .equals("android.intent.action.NEW_OUTGOING_CALL")) {
            if ((bundle = intent.getExtras()) != null) {
                callno = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                callno = callno.replaceAll(" ", "");                    
            }
        }
    }
    catch(Exception e){
    }

    try{
    if (noCallListenerYet) {
        telephonyManager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        if (phoneListener == null) {
            phoneListener = new MyPhoneStateListener(context);
            telephonyManager.listen(phoneListener,
                    PhoneStateListener.LISTEN_CALL_STATE);
        }
        noCallListenerYet = false;
    }
    }catch(Exception e){
        isOnReceive = false;
    }

    context1 = context;
    }

}

public static int returncid() {
    int cid;
    pref = context1.getSharedPreferences("Myprefer", 0);
    SharedPreferences.Editor editor = pref.edit();
    cid = pref.getInt("currentcid", 0);
    if (cid == 0) {
        cid = cid + 1;
    }
    editor.putInt("currentcid", cid);
    editor.commit();
    pref = context1.getSharedPreferences("Myprefer", 0);
    cidvalue = pref.getInt("currentcid", 0);
    return cidvalue;
}


private class MyPhoneStateListener extends PhoneStateListener {

    Context context;
    MyPhoneStateListener(Context c) {
        super();
        context = c;
    }

    /**
     * Listen call state changes.
     */
    public void onCallStateChanged(int state, String incomingNumber) {
        CallTrackerModel ctm = new CallTrackerModel(context1);
        switch (state) {

        // Incoming/Outgoing call over.
        case TelephonyManager.CALL_STATE_IDLE:

            if (CallTrackerModel.returnRecordStarted()) {

                ctm.stopRecording();
                userId = RetrieveUserId.getUserId();

            }

            //For Received calls.
            if (prevState == TelephonyManager.CALL_STATE_OFFHOOK) {

                try{

                    cidvalue = pref.getInt("currentcid", 0);
                    ++cidvalue;
                    pref = context1.getSharedPreferences("Myprefer", 0);
                    SharedPreferences.Editor editor = pref.edit();
                    editor.putInt("currentcid", cidvalue);
                    editor.commit();
                    prevState = state;
                    // Start note activity.
                    Intent i = new Intent(context1, NoteActivity.class);
                    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                    if (userId == null) {
                        userId = "@@";
                    }
                    i.putExtra("userId", userId);
                    i.putExtra("isSend", false);
                    i.putExtra("incomingNumber", incoming_number);
                    context1.startActivity(i);
                    i = null;

                }catch(Exception ex){
                }
            }

            //For missed calls.
            if(prevState==TelephonyManager.CALL_STATE_RINGING){  
                prevState=state;  
            }  

            break;

        //If the caller or receiver picks up the phone
        case TelephonyManager.CALL_STATE_OFFHOOK:
            try{
                if( CallTrackerModel.isRecording() ){
                    break;
                }
                if( NoteActivity.getIsStart() ){
                    NoteActivity.setStop(true);
                }


                prevState = state;
                if (callno.length() == 13) {

                    incoming_number = callno.substring(3);

                } else if (callno.length() == 11) {

                    incoming_number = callno.substring(1);

                } else {

                    incoming_number = callno;

                }

            }catch(Exception ex){
                isOnReceive = false;
            }

            try{
                if( NoteActivity.getIsStop() ){

                    if(NoteActivity.getLater()){
                        NoteActivity.setLater(false);
                        NoteActivity.setStop(false);
                    }else{
                        NoteActivity.later(); 
                    }
                }
            }catch(Exception e){
                isOnReceive = false;
            }

            try{
                Intent i = new Intent(context1, RetrieveUserId.class);
                i.putExtra("incoming number", incoming_number);

                context1.startService(i);
                // start recording
                ctm.startRecording();
            }catch(Exception e){
                isOnReceive = false;
            }

            break;
        case TelephonyManager.CALL_STATE_RINGING:

            if( CallTrackerModel.isRecording() ){

            }else{
                prevState = state;
                callno = incomingNumber;
                callno = callno.replaceAll(" ", "");                    
            }

            break;
        }
    }
}

}

Answer

ousanmaz picture ousanmaz · Sep 29, 2016

Your Broadast Recevier gets fired each time the Phone State Changes.

What this does is it sets the incoming_no to null after Ringing, each time the state changes.

First the phone Rings. At that moment you are able to get the number. When the Phone number changes state to IDLE or OFF_HOOK, your number gets set to null again, since the BR fires all over again.

String incoming_number = null; is what is setting your number to null. This is the code that is messing it up. Turn it into:

MainActivity:

String incoming_number;

BroadcastReceiver

MainActivity.incomingnumber = XXX-XXX-XXXX ; 

//when done with the number clean it
MainActivity.incomingnumber = null;