我有一个注册了来电事件状态的广播接收器,并且我想确保空闲来电是未接来电,而不是被拒绝的来电。为此,我访问 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/