1

我正在執行一個程序以將CallLog發送到服務器,我創建了一個服務,使用以下方法對電話狀態進行輪詢。這個方法被稱爲onCreate。使用服務獲取最後一次CallLog CallLog呼叫日誌

private void pollForCallStatus() { 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      Log.d("Poll", Integer.toString(telephonyManager.getCallState())); 
      switch (telephonyManager.getCallState()){ 
       case TelephonyManager.CALL_STATE_RINGING: 
        Log.d("CallService", "ringing"); 
        break; 
       case TelephonyManager.CALL_STATE_OFFHOOK: 
        callStart(); 
        break; 
       case TelephonyManager.CALL_STATE_IDLE: 
        callEnd(); 
        break; 
      } 
     } 
    }, 0, 1000); 
} 

的方法CallEnd,檢查通話開始,如果它的情況下,其獲得CallLog的這個呼叫的持續時間,我用CallLog因爲我可以呼出啓動時不確定性。

private void callEnd() { 
    if (isStart) { 
     Log.d("CallService", "callEnd"); 
     Integer duration = getDuration(); 
     Log.d("CallService", duration.toString()); 
     Command sender = new SendCall(this.phoneNumber, duration); 
     isStart = false; 
     this.stopSelf(); 
    } 
} 

我粘貼的方法getDuration,我用它來獲取CallLog呼叫的持續時間。

​​

我的問題是,儘管我recive以前的調用,getDuration沒有得到我最後的通話時間。我試圖等待更多的時間,但我收到了同樣的結果。

---編輯---

我改爲使用ContentObserver的代碼,但我有同樣的結果。我在廣播接收器

public class CallsReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 

     ContentResolver cr = context.getContentResolver(); 
     Cursor callLogCursor = cr.query(android.provider.CallLog.Calls.CONTENT_URI, 
      null, 
      null, 
      null, 
      android.provider.CallLog.Calls.DEFAULT_SORT_ORDER /*sort by*/); 

     Command sender = new SendCall(phoneNumber, callLogCursor); 
     context.getContentResolver(). 
      registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI, 
      true, new CallObserver(context, sender)); 
    } 
} 

創建觀察者時CallLog變化執行方法getDuration,新getDuration是

private Integer getDuration(){ 
    Integer duration = 0; 
    callCursor.moveToFirst(); 
    if (phoneNumber.equalsIgnoreCase(callCursor.getString(callCursor.getColumnIndex(CallLog.Calls.NUMBER)))) 
     duration = callCursor.getInt(callCursor.getColumnIndex(CallLog.Calls.DURATION)); 

    Log.d("SendCall.getDuration", duration.toString()); 
    return duration; 
} 

和最後一次通話的時長繼續錯了,這時間是先前調用。我不知道我能做到。

回答

2

添加在通話記錄中的ContentObserver當任何東西callLog即被改變,如果被添加新的呼叫通話記錄或刪除的通話記錄

編輯

試試這個得到新的通話記錄,這將通知您通話結束後我得到正確的結果與此代碼

等待通話結束後3-4秒,然後

CursorLoader cursorLoader = new CursorLoader(mActivity, 
      CallLog.Calls.CONTENT_URI, null, null, null, null); 
managedCursor = cursorLoader.loadInBackground(); 


int durationIndex = managedCursor.getColumnIndex(CallLog.Calls.DURATION); 

managedCursor.moveToFirst(); 

String duration =managedCursor.getString(duration) 
+0

ContentObserver通知我當callLog改變時。但是我不知道這個改變是因爲一個呼叫被添加還是被刪除。我需要知道變化的原因是什麼。 –

+0

謝謝,我的問題是我在調用完成之前創建了Cursor。 –