1.  

在manifest添加以下权限
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

  1.  
  2. /**
  3. * 利用系统CallLog获取通话历史记录
  4. * @param activity
  5. * @param num 要读取记录的数量
  6. * @return
  7. */
  8. public void getCallHistoryList(Activity activity, int num) {
  9. Cursor cs;
  10. if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_CALL_LOG)
  11. != PackageManager.PERMISSION_GRANTED) {
  12. ActivityCompat.requestPermissions(activity,
  13. new String[]{Manifest.permission.READ_CALL_LOG}, 1000);
  14.  
  15. }
  16. cs = activity.getContentResolver().query(CallLog.Calls.CONTENT_URI, //系统方式获取通讯录存储地址
  17. new String[]{
  18. CallLog.Calls.CACHED_NAME, //姓名
  19. CallLog.Calls.NUMBER, //号码
  20. CallLog.Calls.TYPE, //呼入/呼出(2)/未接
  21. CallLog.Calls.DATE, //拨打时间
  22. CallLog.Calls.DURATION, //通话时长
  23. }, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
  24. int i = 0;
  25. if (cs != null && cs.getCount() > 0) {
  26. Date date = new Date(System.currentTimeMillis());
  27. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  28. String date_today = simpleDateFormat.format(date);
  29. for (cs.moveToFirst(); (!cs.isAfterLast()) && i < num; cs.moveToNext(), i++) {
  30. String callName = cs.getString(0); //名称
  31. String callNumber = cs.getString(1); //号码
  32. //如果名字为空,在通讯录查询一次有没有对应联系人
  33. if (callName == null || callName.equals("")){
  34. String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME};
  35. //设置查询条件
  36. String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + "='"+callNumber+"'";
  37. Cursor cursor = getContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  38. cols, selection, null, null);
  39. int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
  40. if (cursor.getCount()>0){
  41. cursor.moveToFirst();
  42. callName = cursor.getString(nameFieldColumnIndex);
  43. }
  44. cursor.close();
  45. }
  46. //通话类型
  47. int callType = Integer.parseInt(cs.getString(2));
  48. String callTypeStr = "";
  49. switch (callType) {
  50. case CallLog.Calls.INCOMING_TYPE:
  51. callTypeStr = CallLogInfo.CALLIN;
  52. break;
  53. case CallLog.Calls.OUTGOING_TYPE:
  54. callTypeStr = CallLogInfo.CALLOUT;
  55. break;
  56. case CallLog.Calls.MISSED_TYPE:
  57. callTypeStr = CallLogInfo.CAllMISS;
  58. break;
  59. default:
  60. //其他类型的,例如新增号码等记录不算进通话记录里,直接跳过
  61. Log.i("ssss",""+callType);
  62. i--;
  63. continue;
  64. }
  65. //拨打时间
  66. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  67. Date callDate = new Date(Long.parseLong(cs.getString(3)));
  68. String callDateStr = sdf.format(callDate);
  69. if (callDateStr.equals(date_today)) { //判断是否为今天
  70. sdf = new SimpleDateFormat("HH:mm");
  71. callDateStr = sdf.format(callDate);
  72. } else if (date_today.contains(callDateStr.substring(0, 7))) { //判断是否为当月
  73. sdf = new SimpleDateFormat("dd");
  74. int callDay = Integer.valueOf(sdf.format(callDate));
  75.  
  76. int day = Integer.valueOf(sdf.format(date));
  77. if (day - callDay == 1) {
  78. callDateStr = "昨天";
  79. } else {
  80. sdf = new SimpleDateFormat("MM-dd");
  81. callDateStr = sdf.format(callDate);
  82. }
  83. } else if (date_today.contains(callDateStr.substring(0, 4))) { //判断是否为当年
  84. sdf = new SimpleDateFormat("MM-dd");
  85. callDateStr = sdf.format(callDate);
  86. }
  87.  
  88. //通话时长
  89. int callDuration = Integer.parseInt(cs.getString(4));
  90. int min = callDuration / 60;
  91. int sec = callDuration % 60;
  92. String callDurationStr = "";
  93. if (sec > 0) {
  94. if (min > 0) {
  95. callDurationStr = min + "分" + sec + "秒";
  96. } else {
  97. callDurationStr = sec + "秒";
  98. }
  99. }
  100.  
  101. /**
  102. * callName 名字
  103. * callNumber 号码
  104. * callTypeStr 通话类型
  105. * callDateStr 通话日期
  106. * callDurationStr 通话时长
  107. * 请在此处执行相关UI或存储操作,之后会查询下一条通话记录
  108. */
  109. Log.i("Msg","callName"+callName);
  110. Log.i("Msg","callNumber"+callNumber);
  111. Log.i("Msg","callTypeStr"+callTypeStr);
  112. Log.i("Msg","callDateStr"+callDateStr);
  113. Log.i("Msg","callDurationStr"+callDurationStr);
  114. }
  115. }
  116. }

android 获取通话记录的更多相关文章

  1. HBuilder 获取通话记录 (Android)

    代码: Date.prototype.Format = function (fmt) { var o = { , //月份 "d+": this.getDate(), //日 == ...

  2. android获取通讯记录,sim卡和手机

    //获取手机和手机卡通讯录 public static String getContacts() { String szContacts = ""; szContacts=getP ...

  3. 【Android】Android6.0读取通话记录

    需求:读取通话记录,然后列表显示,每条记录的数据包括姓名.号码.类型(来电.去电.未接,字体颜色分别为绿.蓝.红),然后长按条目弹出一个列表弹窗,显示[复制号码到拨号盘].[发短信].[打电话]. 先 ...

  4. Android-读取操作系统通话记录并/拨打电话/发送短信/复制号码到拨号盘

    apps目录的contacts应用(有读取通话记录功能),是访问provider目录的provider.contacts应用(有暴露通话记录),所以要阅读Android操作系统源码-->pack ...

  5. javascript提取联通个人信息和通话记录的代码

    由于一些巨大的困难,一些后端爬虫改成了前端爬虫. 前端爬虫是只有js语言,后端爬虫有python java nodejs php这些语言. 前端爬虫有window.document对象,在浏览器端的爬 ...

  6. Android通讯录管理(获取联系人、通话记录、短信消息)

    前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...

  7. 建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS)

    建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS) 电话黑客android恶意软件编程黑客入侵linux 随着我们继续我们的系列,AMUNET应用程序变 ...

  8. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息

    项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...

  9. Android笔记——对系统通话记录的删除操作

    手机通话记录是保存在数据库中的,位置:  /data/data/com.android.providers.contacts/databases/calllog.db ,表名:calls 这张表中有个 ...

随机推荐

  1. 知其所以然~redis的原子性

    原子性 原子性是数据库的事务中的特性.在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节. 对于Redis而言,命 ...

  2. Python的魔法函数

    概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python # -*- codi ...

  3. 如何发起、防御和测试XSS攻击,我们用DVWA来学习(下)

    上一篇我们了解了XSS攻击的原理,并且利用DVWA尝试了简单的XSS攻击,这一篇我们来实现更复杂的攻击,然后探讨防御机制和测试理念. 前面我们通过脚本注入让网页弹出了用户cookie信息,可以光弹窗是 ...

  4. 使用mpvue开发小程序教程(四)

    在上一章节中,我们将vue-cli命令行工具生成的代码骨架中的src目录清理了一遍,然后从头开始配置和编写了一个可以运行的小程序页面,算是正真走上了使用mpvue开发小程序的第一步.今天我们将进一步来 ...

  5. Hibernate【inverse和cascade属性】知识要点

    Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移[当前一方没有控制权] false:控制权没有转移[当前一方有控制权] Inverse属性,是在维护关联关系的时候 ...

  6. leetcode — construct-binary-tree-from-inorder-and-postorder-traversal

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  7. Nagios 监控系统架构

    Nagios 监控系统架设全攻略 简介: Nagios 全名为(Nagios Ain’t Goona Insist on Saintood),最初项目名字是 NetSaint.它是一款免费的开源 IT ...

  8. C# 跨进程 设置窗口owner

    窗口间跨进程通信 1. 发送方 public const int WM_InsertChart_Completed = 0x00AA; //查找窗口 [DllImport("User32.d ...

  9. [MySQL]select和where子句优化

    数据库优化:1.可以在单个SQL语句,整个应用程序,单个数据库服务器或多个联网数据库服务器的级别进行优化2.数据库性能取决于数据库级别的几个因素,例如表,查询和配置设置3.在数据库级别进行优化,在硬件 ...

  10. 折腾Java设计模式之解释器模

    解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...