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

New call log record not found in android broadcastreceiver

我正在开发 android 应用程序,当然需要 phone 调用记录在服务器上以供个人使用。我为此目的注册了 broadcastreceiver,我能够检测到所有类型的呼叫及其详细信息。然而,不可能检测到准确的拨出呼叫时间,即我们可以检测到超出呼叫的完整摘机时间,这不完全是通话时长。因此,仅针对拨出电话结束的情况,我尝试从通话记录历史记录中读取记录。我能够从 broadcastreceiver 读取呼叫日志历史记录以结束去电,但我没有在呼叫日志条目中看到当前收到的呼叫条目。我可以在通话记录中看到所有以前的通话,但看不到我收到 broadcastreceiver 的那个。我在代码中使用 here 中的 Gabe Sechan 示例。我尝试像这样在 outgoingcallended 方法中读取最新的通话记录,

    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 的电话号码,持续时间也是如此。 我知道当我尝试读取通话记录时它还没有更新,我该如何解决这个问题?我错过了什么?

您必须在 getContentResolver() 之前添加一些延迟,以便 table 得到更新。您可以添加 Thread.sleep() 或使用 handler.

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

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

}