我有一个广播接收器注册了来电事件状态,我想确保空闲来电是一个未接来电,因为选择了拒绝来电。为此,我访问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。
提前致谢
答案 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);
}