android获得手机的时间格式,Android获取手机通讯录并按照时间电话类型分类处理...

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

先看看图片详情:

65e71c4bc55f

device-2017-01-08-113015.png

65e71c4bc55f

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 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;

}

以上就是重要的两部分

源码地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值