在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 获取通话记录的更多相关文章

  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. 【Node.js】二、基于Express框架 + 连接MongoDB + 写后端接口

    在上节,我们讲了如何搭建express环境,现在我们说说如何通过node.js写服务接口给前端调用 1. 首先通过MongoDB建好数据库与表格 例如,我的数据库名字为db_demo,数据库表格为go ...

  2. JaveWeb学习之Servlet(二):ServletConfig和ServletContext

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2018-07-26/20.html 作者:夜月归途 出处:http://www.guitu ...

  3. Smobiler 4.0 正式发布

    l Smobiler4.0提供了三大技术亮点:第三方插件.JS.自定义控件等:   强大的插件移动应用引擎 Smobiler支持分插件打包功能和插件扩展机制,让应用开发更加灵活. 分插件打包是指Smo ...

  4. 第24章 退出 - Identity Server 4 中文文档(v1.0.0)

    注销IdentityServer就像删除身份验证cookie一样简单,但是为了完成联合注销,我们必须考虑将用户从客户端应用程序(甚至可能是上游身份提供者)中签名. 24.1 删除认证 要删除身份验证c ...

  5. (5)Maven快速入门_5maven聚合与继承_scope依赖范围

    多个maven项目实现统一管理, maven 插件jar继承自父的maven项目.对maven中jar的版本进行管理. 1.创建一个项目来管理多个maven项目 new ----maven Proje ...

  6. break,return和continue三者区别(Java)

    一.break用于完全结束一个循环,跳出循环体. 不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码. class Demo3 { public static v ...

  7. 我永远爱着OOP——第二单元作业总结

    第二单元的电梯真是愉♂快呢,多线程编程作为java编程OOP中的重要组成部分,通过这一个单元的学习,我也是有了很多全新的认识 那么下面就先例行一下公事 三次作业分析 第五次作业 设计分析 实现的电梯是 ...

  8. 【CentOS7】服务环境搭建

    用了两天时间,完成了服务环境的搭建.记录下了搭建的过程,搭建细节并没有记录. 1.OpenSSH. (1)yum search ssh (2)yum install openssh-server (3 ...

  9. 原生JS实现简易轮播图

    原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...

  10. 面向对象的一小步:添加ActiveRecord的Scope功能

    问题场景 我们用Yii2的ActiveRecord功能非常的方便,假如我们有个Model叫Student,那么ActiveQuery可以通过这种方式轻便地获得: $query = Student::f ...