android 获取通话记录
在manifest添加以下权限
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
- /**
- * 利用系统CallLog获取通话历史记录
- * @param activity
- * @param num 要读取记录的数量
- * @return
- */
- public void getCallHistoryList(Activity activity, int num) {
- Cursor cs;
- if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_CALL_LOG)
- != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(activity,
- new String[]{Manifest.permission.READ_CALL_LOG}, 1000);
- }
- cs = activity.getContentResolver().query(CallLog.Calls.CONTENT_URI, //系统方式获取通讯录存储地址
- new String[]{
- CallLog.Calls.CACHED_NAME, //姓名
- CallLog.Calls.NUMBER, //号码
- CallLog.Calls.TYPE, //呼入/呼出(2)/未接
- CallLog.Calls.DATE, //拨打时间
- CallLog.Calls.DURATION, //通话时长
- }, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
- int i = 0;
- if (cs != null && cs.getCount() > 0) {
- Date date = new Date(System.currentTimeMillis());
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
- String date_today = simpleDateFormat.format(date);
- for (cs.moveToFirst(); (!cs.isAfterLast()) && i < num; cs.moveToNext(), i++) {
- String callName = cs.getString(0); //名称
- String callNumber = cs.getString(1); //号码
- //如果名字为空,在通讯录查询一次有没有对应联系人
- if (callName == null || callName.equals("")){
- String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME};
- //设置查询条件
- String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + "='"+callNumber+"'";
- Cursor cursor = getContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- cols, selection, null, null);
- int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
- if (cursor.getCount()>0){
- cursor.moveToFirst();
- callName = cursor.getString(nameFieldColumnIndex);
- }
- cursor.close();
- }
- //通话类型
- int callType = Integer.parseInt(cs.getString(2));
- String callTypeStr = "";
- switch (callType) {
- case CallLog.Calls.INCOMING_TYPE:
- callTypeStr = CallLogInfo.CALLIN;
- break;
- case CallLog.Calls.OUTGOING_TYPE:
- callTypeStr = CallLogInfo.CALLOUT;
- break;
- case CallLog.Calls.MISSED_TYPE:
- callTypeStr = CallLogInfo.CAllMISS;
- break;
- default:
- //其他类型的,例如新增号码等记录不算进通话记录里,直接跳过
- Log.i("ssss",""+callType);
- i--;
- continue;
- }
- //拨打时间
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- Date callDate = new Date(Long.parseLong(cs.getString(3)));
- String callDateStr = sdf.format(callDate);
- if (callDateStr.equals(date_today)) { //判断是否为今天
- sdf = new SimpleDateFormat("HH:mm");
- callDateStr = sdf.format(callDate);
- } else if (date_today.contains(callDateStr.substring(0, 7))) { //判断是否为当月
- sdf = new SimpleDateFormat("dd");
- int callDay = Integer.valueOf(sdf.format(callDate));
- int day = Integer.valueOf(sdf.format(date));
- if (day - callDay == 1) {
- callDateStr = "昨天";
- } else {
- sdf = new SimpleDateFormat("MM-dd");
- callDateStr = sdf.format(callDate);
- }
- } else if (date_today.contains(callDateStr.substring(0, 4))) { //判断是否为当年
- sdf = new SimpleDateFormat("MM-dd");
- callDateStr = sdf.format(callDate);
- }
- //通话时长
- int callDuration = Integer.parseInt(cs.getString(4));
- int min = callDuration / 60;
- int sec = callDuration % 60;
- String callDurationStr = "";
- if (sec > 0) {
- if (min > 0) {
- callDurationStr = min + "分" + sec + "秒";
- } else {
- callDurationStr = sec + "秒";
- }
- }
- /**
- * callName 名字
- * callNumber 号码
- * callTypeStr 通话类型
- * callDateStr 通话日期
- * callDurationStr 通话时长
- * 请在此处执行相关UI或存储操作,之后会查询下一条通话记录
- */
- Log.i("Msg","callName"+callName);
- Log.i("Msg","callNumber"+callNumber);
- Log.i("Msg","callTypeStr"+callTypeStr);
- Log.i("Msg","callDateStr"+callDateStr);
- Log.i("Msg","callDurationStr"+callDurationStr);
- }
- }
- }
android 获取通话记录的更多相关文章
- HBuilder 获取通话记录 (Android)
代码: Date.prototype.Format = function (fmt) { var o = { , //月份 "d+": this.getDate(), //日 == ...
- android获取通讯记录,sim卡和手机
//获取手机和手机卡通讯录 public static String getContacts() { String szContacts = ""; szContacts=getP ...
- 【Android】Android6.0读取通话记录
需求:读取通话记录,然后列表显示,每条记录的数据包括姓名.号码.类型(来电.去电.未接,字体颜色分别为绿.蓝.红),然后长按条目弹出一个列表弹窗,显示[复制号码到拨号盘].[发短信].[打电话]. 先 ...
- Android-读取操作系统通话记录并/拨打电话/发送短信/复制号码到拨号盘
apps目录的contacts应用(有读取通话记录功能),是访问provider目录的provider.contacts应用(有暴露通话记录),所以要阅读Android操作系统源码-->pack ...
- javascript提取联通个人信息和通话记录的代码
由于一些巨大的困难,一些后端爬虫改成了前端爬虫. 前端爬虫是只有js语言,后端爬虫有python java nodejs php这些语言. 前端爬虫有window.document对象,在浏览器端的爬 ...
- Android通讯录管理(获取联系人、通话记录、短信消息)
前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...
- 建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS)
建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS) 电话黑客android恶意软件编程黑客入侵linux 随着我们继续我们的系列,AMUNET应用程序变 ...
- 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息
项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...
- Android笔记——对系统通话记录的删除操作
手机通话记录是保存在数据库中的,位置: /data/data/com.android.providers.contacts/databases/calllog.db ,表名:calls 这张表中有个 ...
随机推荐
- 知其所以然~redis的原子性
原子性 原子性是数据库的事务中的特性.在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节. 对于Redis而言,命 ...
- Python的魔法函数
概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python # -*- codi ...
- 如何发起、防御和测试XSS攻击,我们用DVWA来学习(下)
上一篇我们了解了XSS攻击的原理,并且利用DVWA尝试了简单的XSS攻击,这一篇我们来实现更复杂的攻击,然后探讨防御机制和测试理念. 前面我们通过脚本注入让网页弹出了用户cookie信息,可以光弹窗是 ...
- 使用mpvue开发小程序教程(四)
在上一章节中,我们将vue-cli命令行工具生成的代码骨架中的src目录清理了一遍,然后从头开始配置和编写了一个可以运行的小程序页面,算是正真走上了使用mpvue开发小程序的第一步.今天我们将进一步来 ...
- Hibernate【inverse和cascade属性】知识要点
Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移[当前一方没有控制权] false:控制权没有转移[当前一方有控制权] Inverse属性,是在维护关联关系的时候 ...
- leetcode — construct-binary-tree-from-inorder-and-postorder-traversal
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...
- Nagios 监控系统架构
Nagios 监控系统架设全攻略 简介: Nagios 全名为(Nagios Ain’t Goona Insist on Saintood),最初项目名字是 NetSaint.它是一款免费的开源 IT ...
- C# 跨进程 设置窗口owner
窗口间跨进程通信 1. 发送方 public const int WM_InsertChart_Completed = 0x00AA; //查找窗口 [DllImport("User32.d ...
- [MySQL]select和where子句优化
数据库优化:1.可以在单个SQL语句,整个应用程序,单个数据库服务器或多个联网数据库服务器的级别进行优化2.数据库性能取决于数据库级别的几个因素,例如表,查询和配置设置3.在数据库级别进行优化,在硬件 ...
- 折腾Java设计模式之解释器模
解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...