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 这张表中有个 ...
随机推荐
- SQLServer特殊字符/生僻字与varchar
对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时v ...
- [十九]JavaIO之PipedReader 和 PipedWriter
功能简介 还记得PipedInputStream 和 PipedOutputStream么 我们之前是这么说的: p, li { white-space: pre-wrap; } 使用管道通信时,必 ...
- ROS笔记 Topics
http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics rostopic rqt_graph rosmsg rqt_graph 一个用于查看topi ...
- 【响应式编程的思维艺术】 (1)Rxjs专题学习计划
目录 一. 响应式编程 二. 学习路径规划 一. 响应式编程 响应式编程,也称为流式编程,对于非前端工程师来说,可能并不是一个陌生的名词,它是函数式编程在软件开发中应用的延伸,如果你对函数式编程还没有 ...
- Smobiler 4.4 更新预告 Part 2(Smobiler能让你在Visual Studio上开发APP)
Hello Everybody,在Smobiler 4.4中,也为大家带来了新增功能和插件(重点,敲黑板). 新增功能: 1, 企业认证用户可设置路由(即客户端可根据不同的IP地址访问不同的服务器组) ...
- HTTP 常见的状态码
- ejs常用语法
nodejs的模板引擎有很多, ejs是比较简单和容易上手的.常用的一些语法: 用<%...%>包含js代码 用<%=...%>输出变量 变量若包含 '<' '>' ...
- laravel5集成支付宝alipay扫码支付流程(Laravel 支付解决方案)
首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Larave ...
- ps快捷键(有道云笔记翻出来以前的存货)
打开 ctrl+o 关闭 ctrl+w 全选 ctrl+a 新建画布 ctrl+n 取消选区 ctrl+d 标尺 ctrl+r 虚线 ...
- 【代码笔记】Web-CSS-CSS Margin(外边距)
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...