Android 获取通话记录和短信内容

一、获取通话记录

1、权限声明,需要在Manifest.xml文件中声明权限(读取通话记录权限):

<uses-permission android:name="android.permission.READ_CALL_LOG"/>

2、代码实现,下面在Activity里面实现功能,实现代码如下:

 @TargetApi(21)private void queryCallLog() {//  权限检查if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG)!= PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode,//      String[] permissions,int[] grantResults)// to handle the case where the user grants the permission. // See the documentation// for ActivityCompat#requestPermissions for more details.Log.w(TAG, "permission is request");/*** 动态申请权限* 这里没有在* onRequestPermissionsResult(int requestCode, * String[] permissions,int[] grantResults)方法里面处理* */ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CALL_LOG}, 100);return;}ContentResolver resolver = getContentResolver();Log.i(TAG, "query call log " + resolver);//获取cursor对象Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls.CACHED_FORMATTED_NUMBER,CallLog.Calls.CACHED_MATCHED_NUMBER,CallLog.Calls.CACHED_NAME,CallLog.Calls.TYPE,CallLog.Calls.DATE,CallLog.Calls.DURATION,CallLog.Calls.GEOCODED_LOCATION,}, null, null, "date DESC limit 2");/***  "date DESC limit 2"*  按时间排序查询2条记录*/if (cursor != null) {Log.i(TAG, "cursor length is " + cursor.getCount());try {while (cursor.moveToNext()) {CallRecord record = new CallRecord();record.formatted_number = cursor.getString(0);record.matched_number = cursor.getString(1);record.name = cursor.getString(2);record.type = getCallType(cursor.getInt(3));record.date = cursor.getLong(4);record.duration = cursor.getLong(5);record.location = cursor.getString(6);Log.i(TAG, record.toString());}} catch (Exception e) {e.printStackTrace();} finally {cursor.close();  //关闭cursor,避免内存泄露}}}

@TargetApi(21) 权限说明,由于开发版本使用minSdkVersion = 14,如果去掉@TargetApi(21) AndroidStudio 出现下面的警告提示:

Manifest.permission.READ_CALL_LOG
Field requires API level 16 (current min is 14): android.Manifest.permission#READ_CALL_LOG

Manifest.permission.READ_CALL_LOG权限版本要求 minSdkVersion = 16

CallLog.Calls.CACHED_FORMATTED_NUMBER
Field requires API level 21 (current min is 14): android.provider.CallLog.Calls
#CACHED_FORMATTED_NUMBERCallLog.Calls.CACHED_MATCHED_NUMBER
Field requires API level 21 (current min is 14): android.provider.CallLog.Calls
#CACHED_MATCHED_NUMBERCallLog.Calls.GEOCODED_LOCATION
Field requires API level 21 (current min is 14): android.provider.CallLog.Calls
#GEOCODED_LOCATION

上面三个权限版本要求 minSdkVersion = 21

属性说明:

CallLog.Calls.CACHED_FORMATTED_NUMBER      通话记录格式化号码
CallLog.Calls.CACHED_MATCHED_NUMBER     通话记录为格式化号码
CallLog.Calls.CACHED_NAME     联系人名称
CallLog.Calls.TYPE    通话类型
CallLog.Calls.DATE    通话时间(long型)
CallLog.Calls.DURATION     通话时长(秒为单位)
CallLog.Calls.GEOCODED_LOCATION    运营商地址(如:浙江杭州)通话类型
CallLog.Calls.INCOMING_TYPE      呼入
CallLog.Calls.OUTGOING_TYPE      呼出
CallLog.Calls.MISSED_TYPE       未接

通话类型转话代码:

private String getCallType(int anInt) {switch (anInt) {case CallLog.Calls.INCOMING_TYPE:return "呼入";case CallLog.Calls.OUTGOING_TYPE:return "呼出";case CallLog.Calls.MISSED_TYPE:return "未接";default:break;}return null;}

时间格式化代码:

public String formatDate(long time) {DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault());return format.format(new Date(time));}

通话时长格式化代码:

public String formatDuration(long time) {long s = time % 60;long m = time / 60;long h = time / 60 / 60;StringBuilder sb = new StringBuilder();if (h > 0) {sb.append(h).append("小时");}if (m > 0) {sb.append(m).append("分");}sb.append(s).append("秒");return sb.toString();}

最后给出CallRecord代码:

class CallRecord {long date;String formatted_number;String matched_number;String name;String type;String location;long duration;@Overridepublic String toString() {return "CallRecord{" +"date=" + formatDate(date) +", formatted_number='" + formatted_number + '\'' +", matched_number='" + matched_number + '\'' +", name='" + name + '\'' +", type=" + type +", location='" + location + '\'' +", duration=" + formatDuration(duration) +'}';}}

然后运行App,在控制台看到一下输出信息:

二、获取短信内容

1、权限声明,需要在Manifest.xml文件中声明权限(读取通话记录权限):

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>

2、代码实现,下面在Activity中实现代码:

 @TargetApi(21)private void queryMessageLog() {//动态申请权限if (ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_CONTACTS}, 101);return;}//动态申请权限if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_SMS}, 101);return;}ContentResolver resolver = getContentResolver();Cursor cursor = resolver.query(Telephony.Sms.CONTENT_URI, new String[]{Telephony.Sms.ADDRESS,   //Telephony.Sms.BODY,Telephony.Sms.DATE,Telephony.Sms.READ,Telephony.Sms.STATUS,Telephony.Sms.TYPE,}, null, null, "date DESC limit 2");if (cursor != null) {while (cursor.moveToNext()) {SMSMessage message = new SMSMessage();message.address = cursor.getString(0);message.body = cursor.getString(1);message.date = cursor.getLong(2);message.read = getMessageRead(cursor.getInt(3));message.status = getMessageStatus(cursor.getInt(4));message.type = getMessageType(cursor.getInt(5));message.person = getPerson(message.address);Log.i(TAG, "message : " + message.toString());}cursor.close();}}

权限如同上述说明,需要动态申请以及API版本的要求
属性说明:

Telephony.Sms.ADDRESS     发件人地址,即手机号
Telephony.Sms.BODY      短信具体内容
Telephony.Sms.DATE      日期,long型
Telephony.Sms.READ      是否阅读0未读,1已读
Telephony.Sms.STATUS     短信状态-1 接收,0 complete,64 pending,128 failed
Telephony.Sms.TYPE      短信类型1是接收到的,2是已发出

短信阅读状态代码:

private String getMessageRead(int anInt) {if (1 == anInt) {return "已读";}if (0 == anInt) {return "未读";}return null;}

短信类型区分代码:

private String getMessageType(int anInt) {if (1 == anInt) {return "收到的";}if (2 == anInt) {return "已发出";}return null;}

短信接收状态代码:

private String getMessageStatus(int anInt) {switch (anInt) {case -1:return "接收";case 0:return "complete";case 64:return "pending";case 128:return "failed";default:break;}return null;}

短信发件人代码,发件人,如果发件人在通讯录中则为具体姓名,陌生人为null:

private String getPerson(String address) {try {ContentResolver resolver = getContentResolver();Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, address);Cursor cursor;cursor = resolver.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);if (cursor != null) {try {if (cursor.getCount() != 0) {cursor.moveToFirst();String name = cursor.getString(0);return name;}} catch (Exception e) {e.printStackTrace();} finally {cursor.close();}}} catch (Exception e) {e.printStackTrace();}return null;}

最后给出SMSMessage代码:

class SMSMessage {long date;String address;String body;String person;String read;String status;String type;@Overridepublic String toString() {return "SMSMessage{" +"date=" + formatDate(date) +", address='" + address + '\'' +", body='" + body + '\'' +", person='" + person + '\'' +", read='" + read + '\'' +", status='" + status + '\'' +", type='" + type + '\'' +'}';}}

然后运行App,控制台输出:

以上就是获取通话记录和短信内容的全部代码。

Android 获取通话记录和短信内容相关推荐

  1. android获取手机短信记录,android 获取手机电话号码和短信内容

    通过ContentResolver 获取到手机的联系人跟手机短信信息并显示出来. 1.实现的代码: package com.example.phone; import java.text.Simple ...

  2. android 获取手机电话号码和短信内容

    通过ContentResolver 获取到手机的联系人跟手机短信信息并显示出来. 1.实现的代码: package com.example.phone;import java.text.SimpleD ...

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

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

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

    Android通讯录管理(获取联系人.通话记录.短信消息)(三) 这是通讯录管理的最后一篇,前面两篇已经把获取联系人和通话记录解决了,短息消息就相对来说要稍微复杂那么一点.我们先来看看效果图: 源码下 ...

  5. android通话记录列表apk,android打电话,发短信,获取通讯录、通话记录、短信记录...

    [实例简介] 代码实现android打电话,发短信,获取通讯录.通话记录.短信记录 [实例截图] [核心代码] 19287b5f-b70c-4210-ab04-9d24ddd60788 └── cal ...

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

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 界面布局: /Contact_Demo/res/layout ...

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

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同样的,你可以到这里下载源码:http://download ...

  8. Google Play通话记录和短信权限使用限制

    前段时间Google Play应用中心收到了限期整改通知,记录一下之前权限适配的问题,防止后面新开项目忘记此限制. Google Play在Facebook泄密丑闻之后收紧对应用获取隐私权限的限制,凡 ...

  9. android 获取通话记录对应卡槽,短信记录对应卡槽

    最新公司有需求 要求屏蔽监听插入双卡后的用户指定一张卡,找了半天资料现在总结一下 1.获取通话记录对应卡槽 通话记录数据库(content://call_log/calls)中有存字段simid Ur ...

最新文章

  1. 先考一键还是先学java_是先考C还是先考JAVA
  2. java cr_WildFly 10 CR 2发布– Java EE 7,Java 8,Hibernate 5,JavaScript支持热重载
  3. LeetCode 495. 提莫攻击
  4. 前端怎么存token_学长:说说你理解的 Token
  5. pku2750 Potted Flower
  6. codeblocks中文编码问题
  7. 复合列NULL问题研究(转)
  8. [转]asp 无法连接 access,出现 -2147467259 未指定的错误
  9. 第六章 线性回归 学习笔记中
  10. 在html种颜色的代码,html颜色代码生成器
  11. Teigha 4.0 Net 开发记录
  12. 教师测评系统php,校无忧教师评价系统 v2.6
  13. 读书笔记:《圈子圈套》
  14. Chapter 2 unit 2 of Bootstrap-Bootstrap CSS
  15. qt GraphicsScene添加背景
  16. jira图片_JIRA issue 中的标记语言(Textile)
  17. CMOS图像传感器OV7725数据手册
  18. 《像三国》3D动效制作经验分享
  19. Ubuntu 下挂ISO到虚拟光驱的方法
  20. 为什么onenote一直在加载_超好用的笔记软件,Onenote是我的最爱

热门文章

  1. HTML知识基础语法篇(8)
  2. python3 接入IOS推送apn
  3. Windows--如何使用PE安装官方ISO镜像
  4. 企业微信第三方应用开发--回调配置
  5. 安利自己读CS博士的鸡汤
  6. python全栈构图_Python全栈 Web(边框、盒模型、背景)
  7. 关于uniapp cheneckbox复选框不显示对号的问题
  8. iOS webview 实现不允许上拉回弹但是可以下拉刷新
  9. 工作中“偷懒”的窍门?这些技巧请你收下!
  10. 【Flutter】----学习笔记1(1~5)