Android 利用系统CallLog获取通话历史记录

  /*** 利用系统CallLog获取通话历史记录
     *@param activity
     *@param num 要读取记录的数量
     *@return
     */
    public void getCallHistoryList(Activity activity, int num) {
        Cursor cs;

        //系统方式获取通讯录存储地址
        cs = activity.getContentResolver().query(CallLog.Calls.CONTENT_URI,

                new String[]{
                        //姓名
                        CallLog.Calls.CACHED_NAME,
                        //号码
                        CallLog.Calls.NUMBER,
                        //呼入/呼出(2)/未接
                        CallLog.Calls.TYPE,
                        //拨打时间
                        CallLog.Calls.DATE,
                        //通话时长
                        CallLog.Calls.DURATION,

                }, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
        int i = 0;
        if (cs != null && cs.getCount() > 0) {
            Date date = new Date(System.currentTimeMillis());

            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

            String date_today = simpleDateFormat.format(date);
            for (cs.moveToFirst(); (!cs.isAfterLast()) && i < num; cs.moveToNext(), i++) {
                //名称
                String callName = cs.getString(0);
                //号码//如果名字为空,在通讯录查询一次有没有对应联系人
                String callNumber = cs.getString(1);

                if (callName == null || callName.equals("")) {
                    //设置查询条件
                    String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME};

                    String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + callNumber + "'";

                    Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

                            cols, selection, null, null);
                    int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
                    if (cursor.getCount() > 0) {
                        cursor.moveToFirst();

                        callName = cursor.getString(nameFieldColumnIndex);

                    }

                    cursor.close();

                }
                //通话类型

                int callType = Integer.parseInt(cs.getString(2));

                String callTypeStr = "";
                switch (callType) {
                    case CallLog.Calls.INCOMING_TYPE:

                        callTypeStr = "CALLIN";
                        break;
                    case CallLog.Calls.OUTGOING_TYPE:

                        callTypeStr = "CALLOUT";
                        break;
                    case CallLog.Calls.MISSED_TYPE:

                        callTypeStr = "CALLMISS";
                        break;
                    //其他类型的,例如新增号码等记录不算进通话记录里,直接跳过
                    default:

                        Log.i("==callType==", "" + callType);

                        i--;
                        continue;

                }
                //拨打时间

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

                Date callDate = new Date(Long.parseLong(cs.getString(3)));

                String callDateStr = sdf.format(callDate);
                if (callDateStr.equals(date_today)) { //判断是否为今天

                    sdf = new SimpleDateFormat("HH:mm");

                    callDateStr = sdf.format(callDate);

                } else if (date_today.contains(callDateStr.substring(0, 7))) { 
                    //判断是否为当月

                    sdf = new SimpleDateFormat("dd");
                    int callDay = Integer.valueOf(sdf.format(callDate));
                    int day = Integer.valueOf(sdf.format(date));
                    if (day - callDay == 1) {
                        callDateStr = "昨天";

                    } else {
                        sdf = new SimpleDateFormat("MM-dd");

                        callDateStr = sdf.format(callDate);

                    }

                } else if (date_today.contains(callDateStr.substring(0, 4))) { 
                    //判断是否为当年

                    sdf = new SimpleDateFormat("MM-dd");

                    callDateStr = sdf.format(callDate);

                }
                //通话时长

                int callDuration = Integer.parseInt(cs.getString(4));
                int min = callDuration / 60;
                int sec = callDuration % 60;

                String callDurationStr = "";
                if (sec > 0) {
                    if (min > 0) {
                        callDurationStr = min + "分" + sec + "秒";

                    } else {
                        callDurationStr = sec + "秒";

                    }

                }
                /*** callName 名字
                 * callNumber 号码
                 * callTypeStr 通话类型
                 * callDateStr 通话日期
                 * callDurationStr 通话时长
                 * 请在此处执行相关UI或存储操作,之后会查询下一条通话记录*/
                Log.i("==Msg==", "callName" + callName);

                Log.i("==Msg==", "callNumber" + callNumber);

                Log.i("==Msg==", "callTypeStr" + callTypeStr);

                Log.i("==Msg==", "callDateStr" + callDateStr);

                Log.i("==Msg==", "callDurationStr" + callDurationStr);
            }
        }
    }

注意:需要动态申请下面三个权限:

Manifest.permission.READ_CALL_LOG,
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值