没有得到CallLog的第一个数据

时间:2011-10-12 04:51:38

标签: android calllog

我正试图接听我刚收到的电话。为此,我正在使用BroadcastReceiver和IntentServices。

就像这样:

在我的BroadcastReceiver类中,我检查状态是否为 OFFHOOK ,如果是,我在 SharedPreferences 中设置了标志,所以当状态变为 IDLE < / strong>,我检查此标志是否仍为true,如果是,我调用 Calllog * ContentProvider IntentService em> *并得到如下的lates数据:

cursor = getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, mCursorFields, null, null, android.provider.CallLog.Calls.DATE + " DESC");

cursor.moveToFirst();
cursor.getString(cursor.getString(cursor.getColumnIndex(android.provider.CallLog.Calls.NUMBER));
...

直到现在它完美地发生,唯一的问题是:

“它没有获得最新的条目。它获得了下一个条目,即在此之前进行的调用。”

所以,如果我之前打电话给'X'人,则在 CallLog 中注册此人来电'X'。而现在,如果我打电话给'Y',而不是打电话给'Y',那就是打电话给'X',这就是我之前的电话。

我不知道会发生什么。当使用 ContentObserver 时,它工作得很好,但我认为使用 BroadcastReceiver 可以更有效地构建它。

有什么想法吗?

提前致谢。


仅关于使用ContentObserver的评论:

  

使用ContentObserver的问题在于,如果我更改名称   一个联系人,它检测到CallLog中的一个变化,因为用户在   具有旧名称的CallLog将更新为新名称,并且   将发生变化并致电该课程。为此,我需要做   验证,检查它是否真的改变了,我认为这很烦人。

3 个答案:

答案 0 :(得分:2)

尝试稍微延迟通话。 我相信在添加通话记录之前需要“一段时间”。 ContentObserver是处理此问题的正确方法,因为您将在发生更改时收到通知。 如果你想以这种方式工作,你需要在手机空闲后的几秒钟内延迟这一过程。

答案 1 :(得分:1)

您正在使用共享的perefernce跟踪呼叫,但效率不高。 而不是你必须采取一个static variable,然后你必须在呼叫状态改变时设置其值 我已经放置了一个下面的代码来跟踪调用状态并从内部数据库中获取新的调用日志数据 这段代码对我来说很好。

public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);

switch (state) {
    case TelephonyManager.CALL_STATE_IDLE:
        // Toast.makeText(context, "CALL_STATE_IDLE", Toast.LENGTH_LONG).show();
        /**this condition will check that last state was not CALL_STATE_IDLE means that 
        * recently there was disconneted call
        */
        if(UDF.phoneState != TelephonyManager.CALL_STATE_IDLE) {
            //You can query for new call log
        } 
        break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
         //Toast.makeText(context, "CALL_STATE_OFFHOOK", Toast.LENGTH_LONG).show();
        break;
    case TelephonyManager.CALL_STATE_RINGING:
         //Toast.makeText(context, "CALL_STATE_RINGING", Toast.LENGTH_LONG).show();
        endCallIfBlocked(incomingNumber);
        break;

    default:
        break;
}
UDF.phoneState = state;
}

答案 2 :(得分:0)

我刚刚修复了从空闲状态下的数据库检索时延迟高达4000毫秒。

handler.postdelay(new Runnable(run() {
    //write code here
}), 4000);

它对我来说很好......