2017-07-19 1 views
0

J'ai essayé le code ci-dessous en ce que la durée d'appel n'est pas correcte, la durée d'appel précédente est affichée pour l'appel téléphonique en cours. J'ai essayé le code et cherché sur le débordement de la pile, le problème n'est pas résolu.Je reçois la durée d'appel précédente au lieu de la durée du dernier appel

private int outgoingCallDuration(Context context) { 

     int sum = 0; 
     StringBuffer sb = new StringBuffer(); 


     try { 
      // 
      Cursor managedCursor = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, null, null, null, null); 

      int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); 
      int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); 
      int date = managedCursor.getColumnIndex(CallLog.Calls.DATE); 
      int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION); 
      sb.append("Call Details :"); 
      Log.e("total count", "" + managedCursor.getCount()); 
      //managedCursor.moveToPosition(managedCursor.getCount() - 1); 
      int currentCount = 0, lastPosition = 0; 
      while (managedCursor.moveToNext()) { 
       currentCount++; 
       //managedCursor.moveToPosition(managedCursor.getCount() - 1); 
       String phNumber = managedCursor.getString(number); 
       String callType = managedCursor.getString(type); 
       String callDate = managedCursor.getString(date); 
       java.sql.Date callDayTime = new java.sql.Date(Long.valueOf(callDate)); 
       String callDurations = managedCursor.getString(duration); 
       String dir = null; 
       int dircode = Integer.parseInt(callType); 


       switch (dircode) { 

        case CallLog.Calls.OUTGOING_TYPE: 
         // lastPosition = currentCount; 
         dir = "OUTGOING"; 
         break; 

        case CallLog.Calls.INCOMING_TYPE: 
         dir = "INCOMING"; 
         break; 

        case CallLog.Calls.MISSED_TYPE: 
         dir = "MISSED"; 
         break; 

       } 
       lastPosition = currentCount; 

      } 

      lastPosition--; 
    //   managedCursor.moveToLast(); 
      managedCursor.moveToPosition(lastPosition); 
      int requiredNumber = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); 
      int durations = managedCursor.getColumnIndex(CallLog.Calls.DURATION); 
      String phNumber = managedCursor.getString(requiredNumber); 
      String dur = managedCursor.getString(durations); 

      // Long durat = Long.parseLong(dur); 
      int myNum = Integer.parseInt(dur); 
      managedCursor.close(); 
      Log.e("last position number ", phNumber); 
      Log.e("last position duration ", dur); 

      return myNum; 
     } catch (SecurityException ex) { 
      Log.d("CallReceiver", "outgoingCallDuration: Permission to read call is not allowed by user!"); 
      return 0; 
     } 
    } 

S'il vous plaît aidez-moi à résoudre ce problème. Comment obtenir la durée du dernier appel dans Android.

+0

[Cochez cette case fil] (https://stackoverflow.com/a/22069349/5130133) –

+0

double possible de [Get Dernière Durée d'appel dans android] (https://stackoverflow.com/questions/19493360/get-last-call-duration-in-android) – sudo

Répondre

1

Vous devez utiliser la clause limit dans votre requête de contenu pour obtenir les détails du dernier appel. Donc, votre requête de contenu deviendra

Cursor cur = getContentResolver().query(CallLog.Calls.CONTENT_URI,null, null,null, android.provider.CallLog.Calls.DATE + " DESC limit 1;"); 
+0

En utilisant cette méthode, une exception se produit –

+0

Vous devez ajouter des autorisations pour lire/écrire des appels –

+0

@ Sagi Mymon J'ai ajouté la permission dans le fichier manifeste –

0

Essayez ce code:

public double getLastOutgoingCallDuration(Context context) { 
    Cursor c = context.getContentResolver() 
      .query(CallLog.Calls.CONTENT_URI, null, null, null, null); 
    double callDuration = 0; 

    if (c != null) { 
     while (c.moveToNext()) { 
      int type = Integer.parseInt(c.getString(c.getColumnIndex(CallLog.Calls.TYPE))); 
      String duration = c.getString(c.getColumnIndex(CallLog.Calls.DURATION)); 
      if (type == CallLog.Calls.OUTGOING_TYPE) 
       callDuration = Double.parseDouble(duration); 
      c.close(); 
     } 
    } 
    return callDuration; 
} 
+0

Aucun problème n'est résolu, la durée de l'appel précédent est toujours affichée –

+0

que voulez-vous exactement? voulez-vous la dernière durée de l'appel sortant? –

+0

oui, je veux la durée du dernier appel mais quand j'ai essayé votre méthode, je reçois la durée de l'appel précédent –