安卓实现查看通话记录
来源:互联网 发布:led显示屏软件通用版 编辑:程序博客网 时间:2024/06/06 18:28
这是实现后的效果图,由于公司还没给我ui,所以就简单的用颜色代替
实现思路
1,通过内容提供者扫描手机的通话记录,并按照手机号进行排序,升序或降序都可以,再按照通话日期排序
Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.NUMBER + "," + CallLog.Calls.DATE + " DESC");
这里说明一下,按照手机号排序的原因是,为了方便整合同一个手机号的通话记录,日期排序是为了方便记录最后通话日期
这是我的bean
public class CallLogBean { /** * 通话类型 0为,未接,1为 拨出,2,为 拨入 */ private int type; /** * 备注名称 */ private String remarkName; /** * 通话日期 */ private String dates; /** * 通话时间 */ private String duration; public void setDuration(String duration) { this.duration = duration; } public String getDuration() { return duration; } /** * 通话类型 0为,未接,1为 拨出,2,为 拨入 */ public int getType() { return type; } /** * 通话类型 0为,未接,1为 拨出,2,为 拨入 */ public void setType(int type) { this.type = type; } public String getRemarkName() { return remarkName; } public void setRemarkName(String remarkName) { this.remarkName = remarkName; } public String getDates() { return dates; } public void setDates(String dates) { this.dates = dates; } @Override public String toString() { return "CallLogBean{" + "type=" + type + ", remarkName='" + remarkName + '\'' + ", dates=" + dates + '}'; }}
扫描之后就开始拿数据了,我这里存数据的类是用TreeMap<String,ArrayList<CallLogBean>>
然后再定义一个变量记录每次拿到的号码,用来判断这次的号码是否和上次拿到的号码一样,如果一样就用put
具体实现
if(number.equals(lastPhone)){ArrayList<CallLogBean> callLogBeens = callLogs.get(number);callLogBeens.add(callLogBean);}else{ArrayList<CallLogBean> callLogBeens = new ArrayList<>();callLogBeens.add(callLogBean);callLogs.put(number,callLogBeens);}lastPhone = number;接下来就是把拿到的数据存起来,剩下的没什么代码了,所以直接贴全部代码
private TreeMap<String, ArrayList<CallLogBean>> getCallLogs() { TreeMap<String, ArrayList<CallLogBean>> callLogs = new TreeMap<>(); String lastPhone = ""; //用于记录每个号码的最后通话日期 ContentResolver cr = getActivity().getContentResolver(); try ( Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, // 查询通话记录的URI null, null, null, CallLog.Calls.NUMBER + "," + CallLog.Calls.DATE + " DESC"); ) { if (cursor == null) { return callLogs; } while (cursor.moveToNext()) { CallLogBean callLogBean = new CallLogBean(); //备注名称 callLogBean.setRemarkName(cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME))); //通话类型 int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); switch (type) { case CallLog.Calls.INCOMING_TYPE: callLogBean.setType(2); break; case CallLog.Calls.OUTGOING_TYPE: callLogBean.setType(1); break; case CallLog.Calls.MISSED_TYPE: callLogBean.setType(0); break; } //通话日期 String date = cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.DATE)); callLogBean.setDates(date); //通话时间 callLogBean.setDuration(cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.DURATION))); //通话号码 String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); LogUtils.v("PhoneFragmentmsg",number + " " + callLogBean); //如果号码存在就继续存通话记录 if(number.equals(lastPhone)){ ArrayList<CallLogBean> callLogBeens = callLogs.get(number); callLogBeens.add(callLogBean); }else{ ArrayList<CallLogBean> callLogBeens = new ArrayList<>(); callLogBeens.add(callLogBean); callLogs.put(number,callLogBeens); } lastPhone = number; } } return callLogs; }那个备注名是为了方便,所以存了很多次
通过这些代码就拿到全部的通话记录,并将同一个号码的通话记录都整合起来
剩下的就是如何把最后的通话类型,通话时间,电话号码等信息显示到listView上
这里再创建一个bean,用来存储要显示的数据
public class CallLogNeedAllBean implements Comparable<CallLogNeedAllBean>,Serializable{ /** * 电话号码 */ private String number; /** * 备注名称 */ private String remarkName; /** * 通话次数 */ private int count; /** * 通话类型 0,未接 1.拨出 2,拨入 */ private int type; /** * 归属地 */ private String location; /** * 最后通话日期 */ private String lastDate; /** * 最后通话日期的Long值 */ private Long lastDateLong; private final long noLoseAccuracy = 14000000000L; public void setLastDateLong(Long lastDateLong) { this.lastDateLong = lastDateLong; } public Long getLastDateLong() { return lastDateLong; } public void setLastDate(String lastDate) { this.lastDate = lastDate; } public String getLastDate() { return lastDate; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getRemarkName() { return remarkName; } public void setRemarkName(String remarkName) { this.remarkName = remarkName; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } @Override public String toString() { return "CallLogNeedAllBean{" + "number='" + number + '\'' + ", remarkName='" + remarkName + '\'' + ", count=" + count + ", type=" + type + ", location='" + location + '\'' + '}'; } @Override public int compareTo(CallLogNeedAllBean callLogNeedAllBean) { return callLogNeedAllBean.lastDateLong.compareTo(lastDateLong); }}由于通话记录是按照日期降序排序的,所以这里用最后通话进行降序排序
最后再把拿到的数据封装成Tree<CallLogNeedAll,Tree<Long,CallLogDurationType>>
第1层的key为要显示的数据,value的key为通话日期,value为每次的通话时间和类型
我刚开始这样封装的目的是为了让通话日期逆序排序,但等我做完后才发现,其实也可以这样封装
TreeMap<CallLogNeedAll,XxxBean> XxxBean为,通话日期,通话时间,通话类型,因为这些数据在拿到的时候就已经排好序了,这样做有点多此一举
这是封装的代码
private void initListItem(TreeMap<String, ArrayList<CallLogBean>> simpleCallLogs, ArrayList<CallLogNeedAllBean> showItem) { Set<Map.Entry<String, ArrayList<CallLogBean>>> entry = simpleCallLogs.entrySet(); for (Map.Entry<String, ArrayList<CallLogBean>> date : entry) { //电话号码 String number = date.getKey(); //备注名称 String remarkName = date.getValue().get(0).getRemarkName(); //最后通话日期 Long lastDate = Long.valueOf(date.getValue().get(0).getDates()); LogUtils.v("PhoneFragmentBkmsg","LastDate " + lastDate); //最后通话类型 int lastType = date.getValue().get(0).getType();//因为已经排好序了,所以直接拿第一个就可以拿到最后通话类型 //通话次数 int count = date.getValue().size(); CallLogNeedAllBean callLogNeedAllBean = new CallLogNeedAllBean(); callLogNeedAllBean.setNumber(number); callLogNeedAllBean.setType(lastType); callLogNeedAllBean.setRemarkName(remarkName); callLogNeedAllBean.setCount(count); callLogNeedAllBean.setLastDateLong(lastDate); //最后通话日期,把他变成date对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = new Date(lastDate); String strDate = sdf.format(date1); callLogNeedAllBean.setLastDate(strDate); callLogNeedAllBean.setLocation(LocationDao.getLocation(getActivity(),number)); //到这里Map的key就完成了 //这是要存储的value,按照通话日期进行排序 TreeMap<Long,CallLogDurationTypeBean> sortForDate = new TreeMap<>(new Comparator<Long>() { @Override public int compare(Long aLong, Long t1) { return (int)(t1 - aLong); } });//这个应该看得懂吧 for(CallLogBean callLogBean : date.getValue()){ CallLogDurationTypeBean callLogDurationTypeBean = new CallLogDurationTypeBean(); callLogDurationTypeBean.setType(callLogBean.getType()); callLogDurationTypeBean.setDuration(callLogBean.getDuration()); sortForDate.put(Long.valueOf(callLogBean.getDates()),callLogDurationTypeBean); } mAllCallLogMap.put(callLogNeedAllBean,sortForDate); }//单独写一个ArrayList,这样要做ListView显示就方便多了 Set<Map.Entry<CallLogNeedAllBean,TreeMap<Long,CallLogDurationTypeBean>>> set = mAllCallLogMap.entrySet(); for(Map.Entry<CallLogNeedAllBean,TreeMap<Long,CallLogDurationTypeBean>> s : set){ showItem.add(s.getKey()); } }
因为我的代码才写到这里,所以没有单个人的通话记录的代码,不过所有需要的数据都拿到了,所以剩下的应该都不是什么问题吧
大概的实现代码就这样,剩下的都比较简单,就不把代码贴出来了,第一次写博客,可能写得有点烂,要骂我的话请不过太过激 0 0
- 安卓实现查看通话记录
- 安卓:ContentResolver访问通话记录,查询显示出通话记录
- 安卓手机获取手机通话记录信息
- 安卓工具类分享-查询通话记录
- sipXecs查看通话记录
- 安卓实现联网查看图片
- 安卓手机短信、通话记录、通信录删除了怎么恢复
- 安卓手机不能开机 怎么备份 联系人 短信 通话记录
- Android 利用ContentObserver查看通话记录
- 安卓源码查看
- 安卓手机各种信息获取---(通讯录短信息通话记录)
- 安卓手机不开机的情况下 怎么备份 联系人 短信 通话记录
- 通过函数实现删除通话记录
- 怎么查看老婆的通话记录?QQ1622863529
- 怎么查看老婆的通话记录?QQ1622863529
- 通话记录
- 通话记录
- eclipse查看安卓源码
- web服务器之boa搭建开发实例
- Linux tcpdump命令详解
- STM32 keil工程配置设置
- struts中的结果集类型Result
- 函数参数与堆栈有关,与寄存器无关
- 安卓实现查看通话记录
- Java中继承java.lang.Enum
- Leetcode 104. Maximum Depth of Binary Tree
- Sql Server 数据库字典工具分享
- MD5 加密工具类
- 洛谷 P1017 进制转换
- 《算法概论》 习题8.8
- notepad++配置python环境
- linuxonandroid ubuntu12.04-v4-core启动文件(N7100 Android 4.3)