java - 检查是否有未接来电

标签 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;
}

我对必须将线程置于 sleep 状态的解决方案不满意,但到目前为止,我没有在任何地方找到该问题的另一种解决方案。我觉得必须有一种更好的方法来做到这一点,所以我向您询问您所知道的关于如何在广播接收器的 onReceive 方法上从 CallLog 获取最新来电的最佳方法。

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

提前致谢

最佳答案

我找到了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);
        }

关于java - 检查是否有未接来电,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26427020/

相关文章:

java - 休息 Controller 单元测试

java - 从 .war 文件中取回我的 java 源代码?

android - Google Play 服务无效

android - 在 Android 中获取热门联系人数据

android - android的READ_LOGS和READ_CALL_LOG权限的区别

android - 使用服务获取 CallLog 上的最后一次通话

java - nosqlunit 注解@UsingDataSet位置

java - 无法识别命令行 Ant

android - 如何隐藏 ActionBar 中的 ChromeCast MediaRoute MenuItem?

java - 从未使用过的变量