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 这张表中有个 ...
随机推荐
- 【ASP.NET Core快速入门】(九) RoutingMiddleware介绍以及MVC引入
前言 前面我们介绍了使用app.Map来配置路由,但是对于一般不是特别大的项目来说,我们不使用Map来进行路由配置. 配置路由 我们首先需要在Startup.cs文件中的ConfigureServic ...
- springboot+mybatis+dubbo+aop日志第一篇
本篇文章主要讲述项目搭建过程,不会涉及过多的基础知识,本项目是作者对前段时间学习的一个总结,主要使用到技术有:maven父子工程.springboot.mybatis.dubbo.zookeeper. ...
- Windows 下常见的反调试方法
稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebu ...
- eclipse svn插件卸载 重新安装 Subclipse卸载安装 The project was not built since its build path is incomplete This client is too old to work with the working copy at
安装插件的原则就是,要按照规则,插件与本地的svn版本要一致, 这样子本地和eclipse上面就可以无缝使用,不会出现问题 1.卸载eclipse svn插件 2,安装新版的svn插件 2.1,下载 ...
- 网络协议抓包分析——TCP传输控制协议(连接建立、释放)
前言 TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方.TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手) ...
- Oracle 连接 另一个Oracle数据库 服务器连接
一.场景 两台不同的服务器A.B分别装有不同业务的oracle数据库,因业务需要,现需要将B中test表的数据,定时同步到A中. 二.实现 根据以上场景,我想到了oracle中的dblink, ...
- 学JAVA的第二天,静态网站制作,脑阔一点疼
先从下载apache-tomcat-9.0.17开始 在下边这个网站下载,下边一步步来 下面删除的这些是暂时用不上的,先吧它删除了,因为会拖慢启动速度 下边把ROOT里边除WEB-INF外的全不删除了 ...
- MySQL Err(1024):Lock wait timeout exceeded; try restarting transaction
查看事务是否占用被锁: SELECT * FROM information_schema.INNODB_TRX;查看里面的 trx_mysql_thread_id字段 show full proces ...
- TensorFlow资料汇总
升级mac自带的python 使用virtualenv进行python环境隔离 tf.nn.conv2d.卷积函数 max_pool 池化函数 TF.VARIABLE.TF.GET_VARIABLE. ...
- 预计2019年发布的Vue3.0到底有什么不一样的地方?
摘要: Vue 3.0预览. 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 微信公众号:技术放肆聊 Fundebug经授权转载,版权归原作者所有. 还有几个月距离 vue2 的 ...