Android获取手机通讯录并按照时间电话类型分类处理

本文用到的RecyclerView标题悬浮,参考连接

先看看图片详情:

《Android获取手机通讯录并按照时间电话类型分类处理》 device-2017-01-08-113015.png
《Android获取手机通讯录并按照时间电话类型分类处理》 device-2017-01-08-113047.png

获取通讯录之后按照时间.类型分类,同一号码同一类型在当天只出现一次

因为考虑到还有悬停的问题,RecyclerView学习(四)—-城市导航列表的实现(上)中的思想是:获取对象名字的拼音然后排序,他这样做是为了侧边索引。因为本文并不需要用到索引,所以并不需要获取拼音,只获取每个通话的时间yyyy-MM-dd,通过比较时间(eques),这样就可以根据悬浮的原理来实现日期分类
一直有个疑问:Java为什么会有eques,感觉跟牵强啊
我实现分类的思想是:因为我查询通话记录是按照时间顺序来的。

 /**
     * 获取所有的通话记录
     *
     * @param context
     */
    public void getCallLog(Context context) {
        try {
            callInfoLogs.clear();
            ContentResolver cr = context.getContentResolver();
            Uri uri = CallLog.Calls.CONTENT_URI;
            String[] projection = new String[]{CallLog.Calls.NUMBER, CallLog.Calls.DATE,
                    CallLog.Calls.TYPE, CallLog.Calls.CACHED_NAME, CallLog.Calls.DURATION, CallLog.Calls.GEOCODED_LOCATION};
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
            }
            Cursor cursor = cr.query(uri, projection, null, null, CallLog.Calls.DATE + " DESC");
            while (cursor.moveToNext()) {
                CallInfoLog callInfoLog = new CallInfoLog();
                String number = cursor.getString(0);//电话号码
                long date = cursor.getLong(1);//通话时间
                int type = cursor.getInt(2);//通话类型
                String name = cursor.getString(3);//名字
                String duration = cursor.getString(4);//通话时长
                String areaCode = cursor.getString(5);//归属地
                String callTime = TransitionTime.convertTimeFirstStyle(date);//格式化时间yyyy-MM-dd
                if (TransitionTime.getTodayData().equals(callTime)) {//如果是今天的话
                    callInfoLog.setCallTime("今天");
                } else if (TransitionTime.getYesData().equals(callTime)) {
                    callInfoLog.setCallTime("昨天");
                } else {
                    callInfoLog.setCallTime(callTime);
                }
                callInfoLog.setNumber(number);
                callInfoLog.setDate(date);
                callInfoLog.setType(type);
                callInfoLog.setName(name);
                callInfoLog.setCountType(1);
                callInfoLog.setDuration(duration);
                callInfoLog.setCode(areaCode);
                //筛选数据
                if (TextUtils.isEmpty(number)) {
                    callInfoLogs.add(callInfoLog);
                    continue;
                }
                boolean isadd = screenData(callInfoLogs, callInfoLog);
                if (isadd) {
                    callInfoLogs.add(callInfoLog);
                }
            }
            cursor.close();
            callLogAdapter.notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

顺便说下:
查看电话记录—CallLog.Calls.CONTENT_URI
CallLog.Calls.CACHED_NAME查询的联系人名字
CallLog.Calls.TYPE电话类型,
CallLog.Calls.NUMBER电话号码
CallLog.Calls.DATE电话日期
(注意:CallLog.Calls.TYPE电话类型的取值 来电:1,拨出:2,未接:3)

查询出来的数据按照:cursor.moveToNext() 时都是按照最新的先获取,所以数据筛选时都要和之前的数据对比,如果是同一号码同一类型同一天的话就不在放入集合中,而是给已经存在的最新的数量上+1。

    /**
     * 筛选数据
     * @param callInfoLogs
     * @param info
     * @return
     */
    private boolean screenData(ArrayList<CallInfoLog> callInfoLogs, CallInfoLog info) {
        if (callInfoLogs.size() > 0) {
            for (int i = 0; i < callInfoLogs.size(); i++) {
                CallInfoLog callInfoLog = callInfoLogs.get(i);
                //如果说是日期和类型全部一样的话那么这个通话记录就不要,变成一个数量归为最近一次记录里面
                if (callInfoLog.getCallTime().equals(info.getCallTime()) && callInfoLog.getType() == info.getType() && info.getNumber().equals(callInfoLog.getNumber())) {
                    callInfoLog.setCountType(callInfoLog.getCountType() + 1);//递增一次
                    //结束这次数据查找
                    return false;
                }
            }
        }
        return true;
    }

以上就是重要的两部分
源码地址

点赞