Android获取通话记录的未接来电、自定义通知栏事件处理

本文记录了如何在Android应用中获取通话记录,特别是24小时内的未接来电,并创建自定义通知栏通知。内容包括权限授权、时间过滤、通知发送以及处理通知响应事件。此外,还提到了在点击通知后手动收起通知栏的权限需求。
摘要由CSDN通过智能技术生成

此文非教程,作常用工具类记录,因此主要是代码---

--前言

   公司项目有这么一个需求,获取用户的通话记录,如果存在24小时内的未接来电则发送状态栏通知,通知上除了可以直接回拨还可以及引导用户打开app的指定模块/页面

因此涉及到知识点:

  1.获取通话记录,并判断是否未接

  2.发送自定义的通知栏信息,并处理响应事件

  3.实践发现点击了自定义通知的按钮,通知栏不会自动收起来因此需要手动收起通知栏

 

----1.  获取通话记录,需要动态权限授权,这里不做额外解释

   //获取通话记录肯定是通过ContentResolver查询了,先定义查询语句
    private static final Uri callUri = CallLog.Calls.CONTENT_URI;

    private static final String[] columns = {
            CallLog.Calls.CACHED_NAME// 通话记录的联系人
            , CallLog.Calls.NUMBER// 通话记录的电话号码
            , CallLog.Calls.DATE// 通话记录的日期
            , CallLog.Calls.DURATION// 通话时长
            , CallLog.Calls.TYPE// 通话类型
            , CallLog.Calls._ID// 通话ID
    };

 

/**
     * 读取数据
     *
     * @return 读取到的数据
     */
    private static List<CallLogEntity> getDataList(Context context) {
        // 1.获得ContentResolver
        ContentResolver resolver = context.getContentResolver();
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
        }
        // 2.利用ContentResolver的query方法查询通话记录数据库
        /**
         * @param uri 需要查询的URI,(这个URI是ContentProvider提供的)
         * @param projection 需要查询的字段
         * @param selection sql语句where之后的语句
         * @param selectionArgs ?占位符代表的数据
         * @param sortOrder 排序方式
         */
        Cursor cursor = resolver.query(callUri, // 查询通话记录的URI
                columns
                , null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示
        );
        List<CallLogEntity> list = new ArrayList<>();
        if (cursor == null) return list;
        // 3.通过Cursor获得数据
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
            String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
            long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE));
            int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));
            int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));
            int id = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID));
            if (isMobileNO(number)) {
                long day_lead = getTimeDistance(new Date(dateLong), new Date());
                if (day_lead < 2) {//只显示48小时以内通话记录,防止通话记录数据过多影响加载速度
                    CallLogEntity callLog = new CallLogEntity();
                    callLog.setCallId(id);
                    callLog.setName(name == null ? "未备注联系人" : name);
                    callLog.setNumber(number);
                    callLog.setDate(dateLong);
                    callLog.setTime(duration);
                    callLog.setType(type);
                    list.add(callLog);
                } else {
                    cursor.close();
                    return list;
                }
            }
        }
        cursor.close();
        return list;
    }

 

因为要根据时间过滤,所以写了一个计算时间距离的方法,略显复杂,其实简化可以直接用

(System.currentTimeMillis() - callLog.getDate())/DAY
     private static long DAY = 1000 * 60 * 60 * 24;

    /**
     * 获得两个日期间距多少天
     *
     * @param beginDate
     * @param endDate
     * @return
     */
    public static long getTimeDistance(Date beginDate, Date endDate) {
        Calendar fromCalendar = Calendar.getInstance();
        fromCalendar.setTime(beginDate);
        fromCalendar.set(Calendar.HOUR_OF_DAY, fromCalendar.getMinimum(Calendar.HOUR_OF_DAY));
        fromCalendar.set(Calendar.MINUTE, fromCalendar.getMinimum(Calendar.MINUTE));
        fromCalendar.set(Calendar.SECOND, fromCalendar.getMinimum(Calendar.SECOND));
        fromCalendar
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值