2016-09-19 102 views
0

我正在研究需要打電話登錄服務器以供個人使用的android應用程序。我有廣播接收方爲此目的註冊,我能夠檢測到所有類型的電話及其詳細信息。但是,不可能檢測到準確的呼出時間,即我們可以檢測完成呼叫的完整OFFHOOK時間,這不是完全通話持續時間。因此,只有在撥出電話結束的情況下,我會嘗試從通話記錄歷史記錄中讀取記錄。我能夠從broadcastreceiver中讀取呼叫記錄歷史記錄,以便結束呼出,但我沒有在呼叫記錄條目中看到當前接收到的呼叫的條目。我可以在通話歷史記錄中查看所有以前的通話,但不能收到我收到廣播接收者的通話。我在我的代碼中使用了來自here的Gabe Sechan示例。我試着去閱讀最新通話記錄這樣outgoingcallended方法,在android broadcastreceiver中找不到新的通話記錄記錄

ContentResolver crs = globalContext.getContentResolver(); 
    Cursor cr = getAllCallLogs(crs); 
    if(cr.moveToFirst()){ 
     duration = cr.getString(cr 
       .getColumnIndex(android.provider.CallLog.Calls.DURATION)); 
     callNumber = cr.getString(cr 
       .getColumnIndex(android.provider.CallLog.Calls.NUMBER)); 


    } 
    private Cursor getAllCallLogs(ContentResolver cr) { 
    // reading all data in descending order according to DATE 
    String strOrder = android.provider.CallLog.Calls.DATE + " DESC"; 
    Uri callUri = Uri.parse("content://call_log/calls"); 
    Cursor cur = cr.query(callUri, null, null, null, strOrder); 

    return cur; 
    } 

但callNumber是以前的電話號碼,而不是爲了我收到broadcastreciver和同樣是持續的情況之一。 我知道,當我嘗試讀取通話記錄時,它不會更新,因此我該如何解決這個問題?我錯過了什麼?

+0

的原因是相同的記錄還沒有在數據庫更新時,您收到的廣播。對於Praveen正確指出的你可以添加一個延遲,但我更願意添加一個內容觀察者而不是 – Ayaanp

回答

0

您必須在getContentResolver()之前添加一些延遲,以便表得到更新。您可以添加Thread.sleep()或可以使用處理程序。

public void loadCursorPostDelayed(){ 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      ContentResolver crs = globalContext.getContentResolver(); 
      ... 
     } 
    }, 1500); 
} 

}

+0

謝謝@Praveen它可以處理3秒的延遲。但是延時方法可靠嗎? –

+0

延遲的方法將在大多數情況下工作,直到設備非常慢。然而,更具體的實現將使用Ayaanp建議的內容觀察者。你會回到數據庫中的數據更改。在更改時,您可以檢查上次呼叫的數據。請檢查[this](http://stackoverflow.com/questions/16582577/android-content-observer-onchange-method-check-if-last-call-is-missed-call-or) – Praveen

+0

是的,這聽起來不錯。謝謝 –