Domanda

Sto facendo un programma per inviare il CallLog a un server, ho creato un servizio che effettua un sondaggio dello stato del telefono con il seguente metodo. Questo metodo è chiamato 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);
}
.

Il metodo callend, controlla se la chiamata è iniziata, se il caso è il caso in cui ottenga la durata di questa chiamata del CallLog, utilizzo CallLog perché non posso determinare quando inizia le chiamate in uscita.

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

Ho incollato il metodo GetDuration, l'ho usato per ottenere la durata della chiamata in 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;
}
.

Il mio problema è che GetDuration non mi prendermi l'ultima durata della chiamata, nonostante abbia ricevuto la chiamata precedente. Ho provato ad aspettare più tempo ma ricevo lo stesso risultato.

--- Modifica ---

Ho cambiato il codice per utilizzare ContenteBserver, ma ho lo stesso risultato. Creo l'osservatore su 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 Modifica esegue il metodo GetDuration, la nuova 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 la durata dell'ultima chiamata continua in errore, questa durata è la chiamata precedente. Non so che posso farlo.

È stato utile?

Soluzione

Aggiungi un contenziosoBserver sul registro delle chiamate che ti avviserà quando qualsiasi cosa viene modificata in Calllog I.e. Se la nuova chiamata viene aggiunta al registro delle chiamate o hai rimosso il registro delle chiamate

Modifica

Prova a ottenere Nuovo registro chiamate dopo la chiamata Finishes Sto ricevendo il giusto risultato con questo codice

Attendere 3-4 secondi dopo la fine della chiamata e poi

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top