android 通话记录分析,Android中联系人和通话记录详解(1)
由于项目开发需要用到手机联系人和通话记录的详细信息,于是对联系人和通话记录的表及各字段以及具体实现做了详细分析。
首先,通过模拟器或者Root过的手机,在/data/data/com.android.providers.contacts/database文件夹下得到contacts2.db数据库文件,然后用SQLite Expert软件打开,可以看到有如下表:
其中,与通话记录有关的表为:calls;与联系人有关的表主要有:contacts,data,mimetypes,raw_contacts,下面做详细分析。
1.通话记录
与通话记录有关的信息全部存储在独立的calls表中,没有其它关联的表,打开calls表,可以看到它一共有24个字段。
表对应的类为android.provider.CallLog.Calls,在Calls类中有查询所有通话记录的Uri(Uri CONTENT_URI =Uri.parse("content://call_log/calls"))和根据电话号码查询通讯记录的Uri(Uri CONTENT_FILTER_URI =Uri.parse("content://call_log/calls/filter"));虽然表中有24个字段,但是在Calls类中并没有表现出24个字段,下面为Calls类中的字段解释:
可以看到,这些字段就是可以从数据库中读取到的通话记录的数据。
那么查询这些信息的具体实现是怎样的呢?首先,通过内容提供者,得到Cursor:
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, null, null, null,CallLog.Calls.DEFAULT_SORT_ORDER);其中CallLog.Calls.DEFAULT_SORT_ORDER="date DESC",表示默认的时间排序方式,也就是从最近的一次通话记录开始读。cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE))//获取通话类型:1.呼入2.呼出3.未接
cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME))//获取联系人的名字
cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER))//获取联系人的电话号码
cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE))//获取通话日期
cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION))//获取通话时长,值为多少秒
......得到这些数据,还需要做一定的处理,比如通话时长的值为秒,但显示的时候通常以“00:00:00”显示,另外要想显示通话记录次数,需要获取到所有的数据后再做统计等等。下面提供一种时间显示处理方式:private String formatDuration(long duration) {
StringBuilder sb = new StringBuilder();
if (duration == 0) {
sb.append("00:00");
} else if (duration > 0 && duration < 60) {
sb.append("00:");
if (duration < 10) {
sb.append("0");
}
sb.append(duration);
} else if (duration > 60 && duration < 3600) {
long min = duration / 60;
long sec = duration % 60;
if (min < 10) {
sb.append("0");
}
sb.append(min);
sb.append(":");
if (sec < 10) {
sb.append("0");
}
sb.append(sec);
} else if (duration > 3600) {
long hour = duration / 3600;
long min = duration % 3600 / 60;
long sec = duration % 3600 % 60;
if (hour < 10) {
sb.append("0");
}
sb.append(hour);
sb.append(":");
if (min < 10) {
sb.append("0");
}
sb.append(min);
sb.append(":");
if (sec < 10) {
sb.append("0");
}
sb.append(sec);
}
return sb.toString();
}最后,这些数据都得到了,但是可能由于数据量特别大(可能有上千条数据)的时候,如果处理的很慢,会给用户带来不好的体验,在这儿只提供几种思路,不提供具体代码实现了。
1.通过AsyncQueryHandler(A helper class to help make handling asynchronousContentResovlequeries easier.)类,专门提供给数据库查询的类,只需要实现它的onQueryComplete方法,然后调用startQuery方法就开始执行,经过测试,效果还好,速度有一定的提升。
2.通过ResourceCursorAdapter( An easy adapter that creates views defined in an XML file. You can specify the XML file that defines the appearance of the views.)类,该类直接将Cursor联系起来,自动做一些数据处理,经过测试,效果很好,速度比用AsyncQueryHandler还快。在SDK的android-sdk-windows\samples\android-14\ApiDemos\src\com\example\android\apis\app中,有一个QuickContactsDemo.java
Demo可以参考。
到此,通话记录的分析结束。下一篇,将对获取联系人信息进行剖析。
android 通话记录分析,Android中联系人和通话记录详解(1)相关推荐
- android mvp模式例子_Android中mvp模式使用实例详解
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...
- android json mysql_Android通过json向MySQL中读写数据的方法详解【读取篇】
本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private vo ...
- Android中联系人和通话记录详解(2)
在文章Android中联系人和通话记录详解(1)中对通话记录进行了分析,本章将对联系人的数据库表.字段以及Insert,Query,Delelte,Update四大基本数据操作进行分析. 与联系人相关 ...
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...
- android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)
前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...
- android 中的悬浮按钮,Android 中FloatingActionButton(悬浮按钮)实例详解
android 中floatingactionbutton(悬浮按钮)实例详解 一.介绍 这个类是继承自imageview的,所以对于这个控件我们可以使用imageview的所有属性 二.使用准备, ...
- Android基础入门教程——2.3.1 TextView(文本框)详解
Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解And ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...
Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...
- Android studio 多渠道(多环境)打包grade配置详解
Android studio 多渠道(多环境)打包grade配置详解 场景:开发app,我们需要两套环境或者两套环境以上的apk,每套环境的apk分两个版本debug版和release版. 公司有套平 ...
最新文章
- bzoj1251: 序列终结者 (splay)
- UITableView
- 如何建立和维护自己的“人脉”
- GStreamer 入门 - Hello,World
- MSBI常见问题总结
- 一文搞懂 Promise、Genarator、 Async 三者的区别和联系
- 13.5.SolrCloud集群使用手册之数据导入
- 双十一 手淘技术用了这几招
- SpringSecurity Basic Authentication
- Android10以上之APEX格式介绍
- Linux系统下如何使用中文输入法
- MyBatis Plus Generator 代码生成器 v3.5.x 案例,含校验、MapStruct、Swagger、QO、VO,自定义 FreeMarker 模板引擎
- max2 android9.0,乐视Max2 lineage16 安卓9.0 极致省电 纯净原生 完美root Xposed 经典版
- 边云协同的优点_关于边缘计算和边云协同,看这一篇就够了
- 【RAM IP】RAM IP核简介及实验
- 新版标准日本语初级_第六课
- 物联网资产暴露情况分析
- 理财-股票(扫文章中的二维码下软件)
- dsp28335 sci中用fifo完成485收发通信_STM32学习笔记—CAN总线收发数据常见问题分析
- C#获取电脑系统信息和硬件信息,兼容XP/Win7/Win10(依赖System.Management.dll)
热门文章
- 视觉SLAM理论与实践第一讲习题
- 普通话测试第四题评分标准_普通话水平测试考试评分标准
- java中Scanner类的使用方法
- 2019 GIAC-全球互联网架构大会课件
- 连接SQL server2008,并在SQL server2008中实现MySQL中group_concatd的分组;使用jsp和servlet实现页面的跳转和重写
- NRF52832蓝牙芯片详细介绍及应用方案
- 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化
- 延续搭载虹膜识别技术 新发布的国美U7手机会让你满意吗?
- SEO工具推荐:台湾本土开发的 《awoo SEO Tool》
- Excel VBA高效办公应用-第十七章-用户权限管理系统