1

我正在尝试接听我刚刚拨打/接听的电话。为此,我使用了 BroadcastReceiver 和 IntentServices。

它是这样发生的:

在我的 BroadcastReceiver 类中,我检查状态是否为OFFHOOK,如果是,我在SharedPreferences中设置标志,所以当状态变为IDLE时,我检查这个标志是否仍然true,如果是,我调用IntentService进入CallLog * ContentProvider * 并像这样获取最新数据:

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 中具有旧名称的用户将更新为新名称,并且会发生更改并调用班上。为此,我需要进行验证,以检查它是否真的改变了,我认为这很烦人。

4

3 回答 3

2

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

于 2011-10-12T04:58:32.797 回答
1

您正在使用共享偏好来跟踪呼叫,这效率不高。而不是你必须拿一个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;
}
于 2011-10-12T05:09:54.547 回答
0

我刚刚修复了在空闲状态下从 db 检索时使 postdelay 达到 4000 毫秒的问题。

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

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

于 2013-07-12T20:19:38.260 回答