Pergunta

Eu estou fazendo um programa para enviar a CallLog para um Servidor, criei um Serviço que faz uma enquete do telefone de status com o seguinte método.Isso é chamado de método 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);
}

O método CallEnd, verifique se a chamada foi iniciado, se for o seu caso, o seu a duração da chamada do CallLog, eu uso CallLog porque eu não podem determinar quando as chamadas de saída é iniciado.

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

Eu colei o método getDuration, usei-a para obter a duração da chamada em 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;
}

O meu problema é que getDuration dont get me a duração da última chamada, apesar de que eu receber a chamada anterior.Eu tentei esperar mais tempo, mas eu receber o mesmo resultado.

--- Editar ---

Eu alterei o código para usar ContentObserver, mas eu tenho o mesmo resultado.Eu criar o Observador, no 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));
    }
}

Quando CallLog alterar executa o método getDuration, o novo 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;
}

e a duração da última chamada continua errado, essa duração é a chamada anterior.Eu não sei o que eu posso fazer isso.

Foi útil?

Solução

Adicionar um ContentObserver no registo de chamadas que vamos notificá-lo quando algo é alterado em callLog i.e.se a nova chamada é adicionado ao log de chamadas ou removidos do registo de chamadas

EDITAR

Tente este novo log de chamada após chamada termina, eu estou ficando resultado certo com este código

Aguarde de 3 a 4 segundos após a chamada terminar e, em seguida,

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top