检查是否错过了来电

时间:2014-10-17 14:15:44

标签: java android calllog

我有一个广播接收器注册了来电事件状态,我想确保空闲来电是一个未接来电,因为选择了拒绝来电。为此,我访问CallLog提供程序以获取最新的设备调用,并将其类型与CallLog.Calls.MISSED_TYPE进行比较。问题是我的接收器在使用设备接收的最后一次调用更新CallLog提供程序之前执行此操作...这就是为什么我在接收器上使用Thread.sleep,让我的接收器等待CallLog提供程序在查询之前进行更新,如下所示:

private boolean isMissedCall(Context context){
    //previous state is a global var   
    if(previousState != null && previousState.equals(RINGING)){

       //THIS IS UGLY!!
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        String callType = android.provider.CallLog.Calls.TYPE;
        String callNew = android.provider.CallLog.Calls.NEW;
        String callDate = android.provider.CallLog.Calls.DATE;
        String[] strFields = { callType, callNew, callDate};

        String strOrder = callDate + " DESC";

        Cursor mCallCursor = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, 
                strFields, 
                null, 
                null, 
                strOrder);

        if (mCallCursor.moveToFirst()) {
            if(mCallCursor.getInt(mCallCursor.getColumnIndex(callNew)) > 0) {
                return mCallCursor.getInt(mCallCursor.getColumnIndex(callType)) == CallLog.Calls.MISSED_TYPE;
            }
        }
    }
    return false;
}

我不满意必须让线程处于睡眠状态的解决方案,但到目前为止,我找不到任何解决问题的方法。我觉得必须有一个方法来做到这一点,我问你在bradcast接收器的onReceive方法上如何从CallLog获得最新来电的最佳方式。

P.S:我的最小目标Android sdk是8。

提前致谢

1 个答案:

答案 0 :(得分:0)

我找到了blog post也可以回答你的问题。

检测未接来电检查,请参阅上述post

中的部分内容
    case TelephonyManager.CALL_STATE_IDLE:
        //Went to idle-  this is the end of a call.  What type depends on previous state(s)
        if(lastState == TelephonyManager.CALL_STATE_RINGING){
            //Ring but no pickup-  a miss
            onMissedCall(context, savedNumber, callStartTime);
        }