1

呼び出し中のときに電話番号が取得されますが、オフフック時にはnullに設定されることがあります。私はそれがヌルになる瞬間を捕らえることができません。テレフォニーマネージャOFFHOOK状態のときに電話番号がヌルに設定されている

コールが着信すると(着信)、それはRINGING STATEになり、番号はcallno変数に設定されます。その後、私が電話を受けると、それはOFFHOOK STATEに行き、コールノでnullを得たので、それは私に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; 
     } 
    } 
} 

}

+0

あなたのコードを質問 –

+0

とともに投稿します。次のログがあります。 - > onReceive()コール状態:null CallNo。 null - > onReceive()コール状態:OFFHOOK CallNo。 7096059843 - > onReceive()呼び出し状態:IDLE CallNo。ヌル – Ekta

答えて

0

を拡張してあなたのBroadast Recevierは毎回電話状態変化をトリガーされます。

これは、状態が変わるたびに、着信後にincoming_noをnullに設定します。

最初に携帯電話のリング。その瞬間に番号を取得することができます。電話番号の状態がIDLEまたはOFF_HOOKに変わると、BRが再び発生するため、ナンバーは再びnullに設定されます。

文字列incoming_number = null;あなたの番号をnullに設定しています。

これはそれを台無しにしているコードです。それを回す:

MainActivity:

文字列incoming_number。

BroadcastReceiver

MainActivity.incomingnumber = XXX-XXX-XXXX。

//数字で終了した場合は、それをクリーニングします MainActivity.incomingnumber = null;

関連する問題