Вопрос

Я делаю программу для отправки 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, потому что я не могу определить, когда начинается исходящие вызовы.

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

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 i.e. Если новый вызов добавлен в журнал вызовов, или вы удалили журнал вызовов

Редактировать

Попробуйте получить новый журнал вызовов после завершения звонка, я получаю правильный результат с этим кодом

Подождите 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