StringBuilder smsBuilder1 = new StringBuilder();

String str = null;
  String strNumber,strName = "";
     int type;
     long callTime;
     Date date;
     String time= "";
     ContentResolver cr = getContentResolver();
     final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI,
                              new String[]{CallLog.Calls.NUMBER,CallLog.Calls.CACHED_NAME,CallLog.Calls.TYPE, CallLog.Calls.DATE,CallLog.Calls.DURATION},
                              null, null,CallLog.Calls.DEFAULT_SORT_ORDER);
     cursor.moveToPosition(0);
     do{  
      strNumber = cursor.getString(0);    //呼叫号码
      strName = cursor.getString(1);   //联系人姓名
      type = cursor.getInt(2);  //来电:1,拨出:2,未接:3 public static final int INCOMING_TYPE = 1;   public static final int OUTGOING_TYPE = 2;   public static final int MISSED_TYPE = 3;
      if(type == 1){
       str = "来电";
      }else if(type == 2){
       str = "拨出";
      }else if(type == 3){
       str = "未接";
      }
      long duration = cursor.getLong(4);  //通话时间
      SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
      date = new Date(Long.parseLong(cursor.getString(3)));
      time = sfd.format(date);
      smsBuilder1.append(strNumber+",");
      smsBuilder1.append(strName+",");
      smsBuilder1.append(str+",");
      smsBuilder1.append(duration+",");
      smsBuilder1.append(time+"\n");
        }while(cursor.moveToNext());
    
        textView2.setText(smsBuilder1.toString());

添加权限:

<uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>