Pregunta

Estoy haciendo un programa para enviar el llamado a un servidor, creé un servicio que hace una encuesta del estado del teléfono con el siguiente método. Este método se llama 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);
}

El método CALLEND, verifique si la llamada ha comenzado, si es el caso, obtiene la duración de esta llamada de la llamada, utilizo CALLLOG porque no puedo determinar cuándo se inicia las llamadas salientes.

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();
    }
}

Pegificé la Duración del método, la usé para obtener la duración de la llamada en 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;
}

Mi problema es que la Detección no me consiga la última duración de la llamada, a pesar de que recito la llamada anterior. Intenté esperar más tiempo, pero recibo el mismo resultado.

--- Editar ---

Cambié el código para usar CONTENTOBSERVER, pero tengo el mismo resultado. Creo que el observador en 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));
    }
}

Cuando CallLog Cambiar ejecuta la Duración del método, la nueva BETDURATION es

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;
}

Y la duración de la última llamada continúa incorrectamente, esta duración es para la llamada anterior. No sé que puedo hacerlo.

¿Fue útil?

Solución

Agregar un ContentObServer en el registro de llamadas que le notificará cuando se cambie cualquier cosa en CallLOG I.E. Si se agrega una llamada nueva al registro de llamadas o eliminó el registro de llamadas

editar

Pruebe esto Obtenga un nuevo registro de llamadas después de que finalice los acabados. Me estoy obteniendo el resultado correcto con este código

Espere durante 3-4 segundos después de que finalice la llamada y luego

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top