我正在进行一个程序要将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);
}
.

方法调用,检查呼叫是否已启动,如果其案例它会获得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();
    }
}
.

我粘贴了该方法升温,我用它来获得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;
}
.

我的问题是,尽管我再次呼叫,但我的问题就是没有给我最后的呼叫持续时间。我试图等待更多的时间,但我收到了相同的结果。

---编辑---

我更改了代码以使用contentobserver,但我有相同的结果。我在broadcastreceiver上创建观察者

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是

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)
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top