由于项目开发需要用到手机联系人和通话记录的详细信息,于是对联系人和通话记录的表及各字段以及具体实现做了详细分析。

首先,通过模拟器或者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)相关推荐

  1. android mvp模式例子_Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

  2. android json mysql_Android通过json向MySQL中读写数据的方法详解【读取篇】

    本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private vo ...

  3. Android中联系人和通话记录详解(2)

    在文章Android中联系人和通话记录详解(1)中对通话记录进行了分析,本章将对联系人的数据库表.字段以及Insert,Query,Delelte,Update四大基本数据操作进行分析. 与联系人相关 ...

  4. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  5. android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...

  6. android 中的悬浮按钮,Android 中FloatingActionButton(悬浮按钮)实例详解

    android 中floatingactionbutton(悬浮按钮)实例详解 一.介绍 这个类是继承自imageview的,所以对于这个控件我们可以使用imageview的所有属性 二.使用准备, ...

  7. Android基础入门教程——2.3.1 TextView(文本框)详解

    Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解And ...

  8. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  9. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

    Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...

  10. Android studio 多渠道(多环境)打包grade配置详解

    Android studio 多渠道(多环境)打包grade配置详解 场景:开发app,我们需要两套环境或者两套环境以上的apk,每套环境的apk分两个版本debug版和release版. 公司有套平 ...

最新文章

  1. bzoj1251: 序列终结者 (splay)
  2. UITableView
  3. 如何建立和维护自己的“人脉”
  4. GStreamer 入门 - Hello,World
  5. MSBI常见问题总结
  6. 一文搞懂 Promise、Genarator、 Async 三者的区别和联系
  7. 13.5.SolrCloud集群使用手册之数据导入
  8. 双十一 手淘技术用了这几招
  9. SpringSecurity Basic Authentication
  10. Android10以上之APEX格式介绍
  11. Linux系统下如何使用中文输入法
  12. MyBatis Plus Generator 代码生成器 v3.5.x 案例,含校验、MapStruct、Swagger、QO、VO,自定义 FreeMarker 模板引擎
  13. max2 android9.0,乐视Max2 lineage16 安卓9.0 极致省电 纯净原生 完美root Xposed 经典版
  14. 边云协同的优点_关于边缘计算和边云协同,看这一篇就够了
  15. 【RAM IP】RAM IP核简介及实验
  16. 新版标准日本语初级_第六课
  17. 物联网资产暴露情况分析
  18. 理财-股票(扫文章中的二维码下软件)
  19. dsp28335 sci中用fifo完成485收发通信_STM32学习笔记—CAN总线收发数据常见问题分析
  20. C#获取电脑系统信息和硬件信息,兼容XP/Win7/Win10(依赖System.Management.dll)

热门文章

  1. 视觉SLAM理论与实践第一讲习题
  2. 普通话测试第四题评分标准_普通话水平测试考试评分标准
  3. java中Scanner类的使用方法
  4. 2019 GIAC-全球互联网架构大会课件
  5. 连接SQL server2008,并在SQL server2008中实现MySQL中group_concatd的分组;使用jsp和servlet实现页面的跳转和重写
  6. NRF52832蓝牙芯片详细介绍及应用方案
  7. 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化
  8. 延续搭载虹膜识别技术 新发布的国美U7手机会让你满意吗?
  9. SEO工具推荐:台湾本土开发的 《awoo SEO Tool》
  10. Excel VBA高效办公应用-第十七章-用户权限管理系统