在android broadcastreceiver

时间:2016-09-19 19:29:10

标签: java android broadcastreceiver calllog

我正在开发Android应用程序,需要将电话记录在服务器上以供个人使用。我为此目的注册了broadcastreceiver,我能够检测所有类型的呼叫及其详细信息。然而,不可能检测到准确的呼出时间,即我们可以检测到超越呼叫的完整OFFHOOK时间,这不是准确的呼叫持续时间。因此,仅对于传出呼叫结束的情况,我尝试从呼叫日志历史记录中读取记录。我可以从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的呼叫号码,持续时间也是如此。 据我所知,当我尝试阅读通话记录时,它没有更新,所以我该如何解决?我错过了什么?

1 个答案:

答案 0 :(得分: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);
}

}