2013-02-02 62 views
5

Trong ứng dụng của tôi, tôi nhận được nhật ký tất cả cuộc gọi bằng cách sử dụng mã này.it trả lại cho tôi tất cả nhật ký cuộc gọi trong điện thoại Android của tôi.Cách nhận nhật ký cuộc gọi từ ngày cụ thể trong android

public class CallLogHelper { 

    public static Cursor getAllCallLogs(ContentResolver cr) { 
     // reading all data in descending order according to DATE 
     String strOrder = android.provider.CallLog.Calls.DATE + " DESC"; 
     Uri callUri = Uri.parse("content://call_log/calls"); 
     Cursor curCallLogs = cr.query(callUri, null, null, null, strOrder); 
     return curCallLogs; 
    } 

    public static void insertPlaceholderCall(ContentResolver contentResolver, 
      String name, String number) { 
     ContentValues values = new ContentValues(); 
     values.put(CallLog.Calls.NUMBER, number); 
     values.put(CallLog.Calls.DATE, System.currentTimeMillis()); 
     values.put(CallLog.Calls.DURATION, 0); 
     values.put(CallLog.Calls.TYPE, CallLog.Calls.OUTGOING_TYPE); 
     values.put(CallLog.Calls.NEW, 1); 
     values.put(CallLog.Calls.CACHED_NAME, name); 
     values.put(CallLog.Calls.CACHED_NUMBER_TYPE, 0); 
     values.put(CallLog.Calls.CACHED_NUMBER_LABEL, ""); 
     Log.d("Call Log", "Inserting call log placeholder for " + number); 
     contentResolver.insert(CallLog.Calls.CONTENT_URI, values); 
    } 

} 

Nhưng vấn đề của tôi là tôi muốn nhận nhật ký cuộc gọi từ ngày cụ thể, không phải tất cả nhật ký cuộc gọi. Tôi không biết cách sử dụng truy vấn để nhận nhật ký cuộc gọi từ ngày cụ thể. Giúp tôi Cảm ơn

Trả lời

5
 String[] strFields = { 
       android.provider.CallLog.Calls.NUMBER, 
       android.provider.CallLog.Calls.TYPE, 
       android.provider.CallLog.Calls.CACHED_NAME, 
       android.provider.CallLog.Calls.DATE, 
       android.provider.CallLog.Calls.DURATION, 

       }; 

     // Defines a string to contain the selection clause 
     String mSelectionClause = android.provider.CallLog.Calls.DATE+ " >= ?"; 

     // Initializes an array to contain selection arguments 
     String[] mSelectionArgs = { createDate(2013,1,1).toString() }; 

     Cursor mCallCursor = currentContext.getContentResolver().query(
       android.provider.CallLog.Calls.CONTENT_URI, 
       strFields, 
       mSelectionClause, 
       mSelectionArgs, 
       null 
       ); 

     return mCallCursor; 

public static Long createDate(int year, int month, int day) 
{ 
    Calendar calendar = Calendar.getInstance(); 

    calendar.set(year, month, day); 

    return calendar.getTimeInMillis(); 

} 
+2

Khá chắc chắn mã này sẽ gây ra và ngoại lệ OOB khi gán giá trị ngày cho mSelectionArgs [1], phải là mSelectionArgs [0] = createDate (2013,1,1) .toString(). Tốt hơn là sẽ khởi tạo giá trị chuỗi thay vì tạo một chuỗi rỗng và sau đó loại bỏ nó ngay lập tức, như trong: String [] mSelectionArgs = {String.valueOf (createDate (2013,1,1))}. – Brandon

+1

Sẽ upvote câu trả lời nếu Brandon 'sửa chữa được kết hợp. – Kobor42

+4

Xin chào các bạn đã sử dụng mã trên nhưng tôi vẫn nhận được một con trỏ trống mặc dù tôi có dữ liệu trong nhật ký cuộc gọi? bất kỳ ý tưởng? – kAnNaN

3
StringBuffer sb = new StringBuffer(); 
    String strOrder = android.provider.CallLog.Calls.DATE + " DESC"; 
    Uri callUri = Uri.parse("content://call_log/calls"); 

    Calendar calendar = Calendar.getInstance(); 

    calendar.set(2014, Calendar.MAY, 25); 
    String fromDate = String.valueOf(calendar.getTimeInMillis()); 
    calendar.set(2014, Calendar.MAY, 30); 
    String toDate = String.valueOf(calendar.getTimeInMillis()); 
    String[] whereValue = {fromDate,toDate}; 


    Cursor cur = cr.query(callUri, null, android.provider.CallLog.Calls.DATE+" BETWEEN ? AND ?", whereValue, strOrder); 

    //Cursor cur = cr.query(callUri, null, android.provider.CallLog.Calls.DATE+" >= ?", whereValue, strOrder); 
    // loop through cursor 
    while (cur.moveToNext()) { 
     String callNumber = cur.getString(cur 
       .getColumnIndex(android.provider.CallLog.Calls.NUMBER)); 

     String callName = cur 
       .getString(cur 
         .getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME)); 

     String callDate = cur.getString(cur 
       .getColumnIndex(android.provider.CallLog.Calls.DATE)); 
     SimpleDateFormat formatter = new SimpleDateFormat(
       "dd-MMM-yyyy HH:mm"); 
     String dateString = formatter.format(new Date(Long 
       .parseLong(callDate))); 

     String callType = cur.getString(cur 
       .getColumnIndex(android.provider.CallLog.Calls.TYPE)); 
     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; 
    } 

     String isCallNew = cur.getString(cur 
       .getColumnIndex(android.provider.CallLog.Calls.NEW)); 

     String duration = cur.getString(cur 
       .getColumnIndex(android.provider.CallLog.Calls.DURATION)); 

     sb.append("\nPhone Number:--- " + callNumber + " \nName:--- "+ callName +" \nCall Type dir:--- " + dir + " \nCall Date:--- " + dateString + " \n duration in sec :--- " + duration); 
     sb.append("\n----------------------------------"); 

    } 

Nhật ký cuộc gọi đó quay trở lại là giữa 25/05/2014 & 30/05/2014. Giá trị trả về được lưu trữ trong biến sb, bạn có thể đặt giá trị này trong TextView để thử nghiệm

+0

Nó thực sự là hữu ích nhờ. – Dhamodharan

+0

@Dhamodharan, Bạn được chào đón! :) – Vattic

Các vấn đề liên quan