Номер телефона имеет значение null во время состояния OFFHOOK в TelephonyManager.

Я получаю номер телефона во время состояния звонка, но иногда он устанавливается равным нулю во время состояния снятия трубки. Я не могу поймать момент, когда он становится нулевым.

Итак, когда приходит звонок (входящий звонок) он идет на RINGING STATE и номер устанавливается в переменную callno. После этого, когда я отвечаю на звонок, он переходит на OFFHOOK STATE, и я получил null в callno, поэтому он дает мне NullPointerException.

Как предотвратить эту ситуацию?

открытый класс CallStateReceiver расширяет 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;
        }
    }
}

}


person Ekta    schedule 22.09.2016    source источник
comment
опубликуйте свой код вместе с вопросом   -  person Pavneet_Singh    schedule 22.09.2016
comment
Я получил следующие журналы: --›onReceive() Состояние вызова: null CallNo. null --›onReceive() Состояние вызова: OFFHOOK CallNo. 7096059843 --›onReceive() Состояние вызова: IDLE CallNo. нулевой   -  person Ekta    schedule 23.09.2016


Ответы (2)


Ваш широковещательный приемник срабатывает каждый раз, когда изменяется состояние телефона.

Что это делает, так это устанавливает для incoming_no значение null после звонка каждый раз, когда изменяется состояние.

Сначала звонит телефон. В этот момент вы можете получить номер. Когда номер телефона меняет состояние на IDLE или OFF_HOOK, ваш номер снова становится нулевым, поскольку BR срабатывает снова и снова.

String incoming_number = null; - это то, что устанавливает ваш номер на ноль. Это код, который все портит. Превратите его в:

MainActivity:

String incoming_number;

BroadcastReceiver

MainActivity.incomingnumber = XXX-XXX-XXXX ; 

//when done with the number clean it
MainActivity.incomingnumber = null;
person ousanmaz    schedule 29.09.2016

или вы можете просто удалить приложение для записи звонков. Приложения для записи звонков также вызывают эту проблему.

person Twisted    schedule 02.04.2020