2013-10-21 23 views
6

Szukam najprostszego sposobu na uzyskanie czasu trwania połączenia z ostatnio wybieranego numeru. Więc na przykład, gdy zadzwoniłam do mojej mamy, gdy przerwałam połączenie, powinno pojawić się powiadomienie o czasie trwania.Uzyskaj ostatni czas trwania połączenia w Androidzie

Próbuję następujące rzeczy, ale problem polega na tym, że zawiera pełną listę czasu trwania. przychodzące, wychodzące, nieodebrane.

Jak odróżnić go:

Próbowałem następujące:

private void getCallDetails() { 

    StringBuffer sb = new StringBuffer(); 
    Cursor cur = getContentResolver().query(CallLog.Calls.CONTENT_URI,null, null,null, android.provider.CallLog.Calls.DATE + " DESC"); 

    int number = cur.getColumnIndex(CallLog.Calls.NUMBER); 
    int duration = cur.getColumnIndex(CallLog.Calls.DURATION); 
    sb.append("Call Details : \n"); 
    while (cur.moveToNext()) { 
     String phNumber = cur.getString(number); 
     String callDuration = cur.getString(duration); 
     String dir = null; 

     sb.append("\nPhone Number:--- "+phNumber +" \nCall duration in sec :--- "+callDuration); 
     sb.append("\n----------------------------------"); 
    } 
    cur.close(); 
    call.setText(sb); 
} 
+0

@ TheDevMan pan rozwiązał ten problem? jeśli rozwiązany oznacza, że ​​pls mówią rozwiązanie. –

Odpowiedz

9

Spróbuj poniżej kodu:

private void getCallDetails() { 
     StringBuffer sb = new StringBuffer(); 
     Uri contacts = CallLog.Calls.CONTENT_URI; 
     Cursor managedCursor = context.getContentResolver().query(contacts, 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 :"); 
     while (managedCursor.moveToNext()) { 

      HashMap rowDataCall = new HashMap<String, String>(); 

      String phNumber = managedCursor.getString(number); 
      String callType = managedCursor.getString(type); 
      String callDate = managedCursor.getString(date); 
      String callDayTime = new Date(Long.valueOf(callDate)).toString(); 
      // long timestamp = convertDateToTimestamp(callDayTime); 
      String callDuration = managedCursor.getString(duration); 
      String dir = null; 
      int dircode = Integer.parseInt(callType); 
      switch (dircode) { 
      case CallLog.Calls.OUTGOING_TYPE: 
       dir = "OUTGOING"; 
       break; 

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

      case CallLog.Calls.MISSED_TYPE: 
       dir = "MISSED"; 
       break; 
      } 
      sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration); 
      sb.append("\n----------------------------------"); 


     } 
     managedCursor.close(); 
     System.out.println(sb); 

dostaniesz TypPołączenia się poniżej linii:

int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); 
+0

Daje mi to pełną listę dzienników połączeń. Chcę tylko, aby bieżący czas trwania połączenia był wyświetlany natychmiast po zakończeniu połączenia. – TheDevMan

+0

Otrzymuję poprzedni czas trwania połączeń, nie ostatni czas trwania połączenia. – TheDevMan

+2

Tak, więc dowiedziałeś się ostatniego wpisu z tego zapytania, wykonaj jedną pętlę i otrzymaj tylko ostatni wpis, dostaniesz go. –

2

Ten kod działa dobrze dla mnie .......

void retriveCallSummary() { 

      Log.i("*****retriveCallSummary******","Call retrive method worked"); 
      StringBuffer sb = new StringBuffer(); 
      Uri contacts = CallLog.Calls.CONTENT_URI; 
      Cursor managedCursor = mContext.getContentResolver().query(
        contacts, null, null, null, null); 
      int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); 
      int duration1 = managedCursor.getColumnIndex(CallLog.Calls.DURATION); 
      if(managedCursor.moveToFirst() == true) { 
       String phNumber = managedCursor.getString(number); 
       String callDuration = managedCursor.getString(duration1); 
       String dir = null; 
       sb.append("\nPhone Number:--- "+phNumber +" \nCall duration in sec :--- "+callDuration); 
       sb.append("\n----------------------------------"); 
        Log.i("*****Call Summary******","Call Duration is:-------"+sb); 
      } 
      managedCursor.close(); 
     } 
+0

managedCursor.moveToFirst() pomaga uzyskać szczegóły połączenia dla ostatniego połączenia. – Sam

+0

managedCursor.moveToLast() jest poprawną metodą pobierania ostatniego połączenia – longwalker

0

Ten kod to działa w 100% i używane

public String LastCall() { 
     StringBuffer sb = new StringBuffer(); 
     Cursor cur = getContentResolver().query(CallLog.Calls.CONTENT_URI,null, null,null, android.provider.CallLog.Calls.DATE + " DESC"); 

     int number = cur.getColumnIndex(CallLog.Calls.NUMBER); 
     int duration = cur.getColumnIndex(CallLog.Calls.DURATION); 
     sb.append("Call Details : \n"); 
     while (cur.moveToNext()) { 
      String phNumber = cur.getString(number); 
      String callDuration = cur.getString(duration); 
      sb.append("\nPhone Number:"+phNumber); 
      break; 
     } 
    cur.close(); 
    String str=sb.toString(); 
    return str; 
} 
+0

podaje dane drugiego ostatniego połączenia. – sanjay

6

Trzeba użyć graniczną klauzulę w treści zapytanie, aby uzyskać szczegóły ostatniego połączenia. Więc zapytanie zawartość będzie

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

Dodałem tę linię w wyjątku catch catch i otrzymałem ostatnie dane kontaktowe – VyTcdc

2

To jest mój kod i działa perfekcyjnie dla ostatniego połączenia wychodzącego.

private String getCallDetails() { 

    StringBuffer sb = new StringBuffer(); 
    Cursor managedCursor = managedQuery(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); 

    managedCursor.moveToLast(); 
     String phNumber = managedCursor.getString(number); 
     String callType = managedCursor.getString(type); 
     String callDate = managedCursor.getString(date); 
     Date callDayTime = new Date(Long.valueOf(callDate)); 
     String callDuration = managedCursor.getString(duration); 
     String dir = null; 
     int dircode = Integer.parseInt(callType); 

     switch (dircode) { 
      case CallLog.Calls.OUTGOING_TYPE: 
       dir = "OUTGOING"; 
       break; 

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

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

    if(dir.equals("OUTGOING")){ 
     //whatever you want here 
     return "yes"; 
    } 

    managedCursor.close(); 
    return "no"; 

} 
0

Oto kod do uzyskania ostatniego czasu trwania połączenia. Spróbuj go, działa. Czas trwania ostatniego połączenia jest pobierany z dzienników połączeń.

public void getCallLog() { 
    StringBuffer sb = new StringBuffer(); 
    Cursor managedCursor = managedQuery(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); 
     Date callDayTime = new Date(Long.valueOf(callDate)); 
     String callDuration = 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; 
     sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration); 
     sb.append("\n----------------------------------"); 
     Log.e("test", sb.toString()); 
    } 

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

    textView.setText(phNumber); 
    textDuration.setText(dur); 
    Log.e("last position number ", phNumber); 
    Log.e("last call Duration ", dur); 
    managedCursor.close(); 
} 
0
public class Home extends Activity { 
    TextView textView = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.home_activity); 
     textView = (TextView) findViewById(R.id.textview_call); 
     getCallDetails(); 
    } 

    private void getCallDetails() { 

     Context context; 
     StringBuffer sb = new StringBuffer(); 
     Uri contacts = CallLog.Calls.CONTENT_URI; 
     try { 
      Cursor managedCursor = getContentResolver().query(CallLog.Calls.CONTENT_URI,null, null,null, android.provider.CallLog.Calls.DATE + " DESC limit 1;"); 
      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 :"); 
      while (managedCursor.moveToNext()) { 

       HashMap rowDataCall = new HashMap<String, String>(); 

       String phNumber = managedCursor.getString(number); 
       String callType = managedCursor.getString(type); 
       String callDate = managedCursor.getString(date); 
       String callDayTime = new Date(Long.valueOf(callDate)).toString(); 
       // long timestamp = convertDateToTimestamp(callDayTime); 
       String callDuration = managedCursor.getString(duration); 
       String dir = null; 
       int dircode = Integer.parseInt(callType); 
       switch (dircode) { 
        case CallLog.Calls.OUTGOING_TYPE: 
         dir = "OUTGOING"; 
         break; 

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

        case CallLog.Calls.MISSED_TYPE: 
         dir = "MISSED"; 
         break; 
       } 
       sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration); 
       sb.append("\n----------------------------------"); 


      } 
      managedCursor.close(); 
      System.out.println(sb); 
      textView.setText(sb); 
     } 
     catch (SecurityException e) 
     { 
      System.out.println(); 
      // lets the user know there is a problem with the code 
     } 




    } 
}