在android broadcastreceiver中找不到新的通话记录记录

问题描述:

我正在研究需要打电话登录服务器以供个人使用的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

您必须在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://*.com/questions/16582577/android-content-observer-onchange-method-check-if-last-call-is-missed-call-or) – Praveen

+0

是的,这听起来不错。谢谢 –