我正在做一个程序,将CallLog发送到服务器,我创建了一个服务,该服务使用以下方法对电话状态进行轮询。此方法称为onCreate。
private void pollForCallStatus() {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.d("Poll", Integer.toString(telephonyManager.getCallState()));
switch (telephonyManager.getCallState()){
case TelephonyManager.CALL_STATE_RINGING:
Log.d("CallService", "ringing");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
callStart();
break;
case TelephonyManager.CALL_STATE_IDLE:
callEnd();
break;
}
}
}, 0, 1000);
}
方法CallEnd,检查呼叫是否已开始,如果是这种情况,则获取CallLog的此呼叫的持续时间,因此我使用CallLog,因为我无法确定呼出呼叫何时开始。
private void callEnd() {
if (isStart) {
Log.d("CallService", "callEnd");
Integer duration = getDuration();
Log.d("CallService", duration.toString());
Command sender = new SendCall(this.phoneNumber, duration);
isStart = false;
this.stopSelf();
}
}
我粘贴了方法getDuration,使用它来获取CallLog中的通话持续时间。
private Integer getDuration(){
Integer duration = 0;
callLogCursor.moveToFirst();
if ( phoneNumber.equalsIgnoreCase(callLogCursor.getString(callLogCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
duration = callLogCursor.getInt(callLogCursor.getColumnIndex(CallLog.Calls.DURATION));
return duration;
}
我的问题是,尽管我接听了前一个电话,但getDuration没有使我保持最近的通话时间。我尝试等待更多时间,但收到的结果相同。
-编辑-
我将代码更改为使用ContentObserver,但结果相同。我在BroadcastReceiver上创建了Observer
public class CallsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
ContentResolver cr = context.getContentResolver();
Cursor callLogCursor = cr.query(android.provider.CallLog.Calls.CONTENT_URI,
null,
null,
null,
android.provider.CallLog.Calls.DEFAULT_SORT_ORDER /*sort by*/);
Command sender = new SendCall(phoneNumber, callLogCursor);
context.getContentResolver().
registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
true, new CallObserver(context, sender));
}
}
当CallLog更改执行方法getDuration时,新的getDuration为
private Integer getDuration(){
Integer duration = 0;
callCursor.moveToFirst();
if ( phoneNumber.equalsIgnoreCase(callCursor.getString(callCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
duration = callCursor.getInt(callCursor.getColumnIndex(CallLog.Calls.DURATION));
Log.d("SendCall.getDuration", duration.toString());
return duration;
}
并且最后一个通话的持续时间继续错误,该持续时间是上一个通话的持续时间。我不知道我能做到。
最佳答案
在通话记录上添加ContentObserver,当callLog中发生任何更改时,即当新通话添加到通话记录中或您删除了通话记录时,它将通知您
编辑
通话结束后尝试使用此获取新的通话记录,我用此代码获得正确的结果
通话结束后等待3-4秒,然后
CursorLoader cursorLoader = new CursorLoader(mActivity,
CallLog.Calls.CONTENT_URI, null, null, null, null);
managedCursor = cursorLoader.loadInBackground();
int durationIndex = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
managedCursor.moveToFirst();
String duration =managedCursor.getString(duration)