Question

Je fais un programme pour envoyer le CallLog sur un serveur, j'ai créé un service qui effectue un sondage de l'état du téléphone avec la méthode suivante. Cette méthode s'appelle 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 de la méthode, vérifiez si l'appel a commencé, si c'est le cas, il est possible de passer la durée de cet appel du CallLog, j'utilise CallLog car je ne peux pas déterminer lorsque les appels sortants commencent.

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

J'ai collé la méthode getduration, je l'ai utilisé pour obtenir la durée de l'appel dans 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;
}

Mon problème est que la getduration ne me donne pas la dernière durée des appels, malgré cela, je récupère l'appel précédent. J'ai essayé d'attendre plus de temps mais je reçois le même résultat.

--- Edit ---

J'ai changé le code pour utiliser contentobserver, mais j'ai le même résultat. Je crée l'observateur sur Broadcasteceiver

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

Lorsque CallLog Change exécute la méthode getduration, la nouvelle getDuration est

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

Et la durée du dernier appel continue de mal, cette durée est à l'appel précédent. Je ne sais pas que je peux le faire.

Était-ce utile?

La solution

Ajouter un contentobserver sur le journal des appels qui vous informera lorsque quelque chose est modifié dans CallLog I.e. Si un nouvel appel est ajouté au journal des appels ou que vous avez supprimé le journal des appels

Modifier

Essayez ceci Obtenir un nouveau journal d'appel après les finitions d'appel, je reçois droit le résultat avec ce code

Attendez 3-4 secondes après l'appel terminé, puis

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top