获取手机通话记录流程:
1、 获取ContentResolver;
ContentResolver resolver = getContentResolver();
2、resolver.query(*);
需要传入通话记录的URI:CallLog.Calls.CONTENT_URI
3、对查询得到的Cursor进行数据获取.
主要代码如下:
MainActivity

public class MainActivity extends AppCompatActivity {private ListView slvItem;private List<Map<String, String>> dataList;private ContentResolver resolver;private Uri callUri = CallLog.Calls.CONTENT_URI;private String[] columns = {CallLog.Calls.CACHED_NAME// 通话记录的联系人, CallLog.Calls.NUMBER// 通话记录的电话号码, CallLog.Calls.DATE// 通话记录的日期, CallLog.Calls.DURATION// 通话时长, CallLog.Calls.TYPE};// 通话类型}private ImpowerAdapter impowerAdapter;private String mobile;//被授权人电话号码@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();getPersimmionInfo();}private void initView() {slvItem = findViewById(R.id.slv_impower_item);}//**************授权信息private void getPersimmionInfo() {if (Build.VERSION.SDK_INT >= 23) {//1. 检测是否添加权限   PERMISSION_GRANTED  表示已经授权并可以使用if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {//手机为Android6.0的版本,权限未授权去i请授权//2. 申请请求授权权限//1. Activity// 2. 申请的权限名称// 3. 申请权限的 请求码ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CALL_LOG//通话记录}, 1005);} else {//手机为Android6.0的版本,权限已授权可以使用// 执行下一步initContacts();}} else {//手机为Android6.0以前的版本,可以使用initContacts();}}private void initContacts() {dataList = getDataList();impowerAdapter = new ImpowerAdapter(this, dataList);slvItem.setAdapter(impowerAdapter);slvItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {mobile = dataList.get(position).get("number").replaceAll(" ", "").replaceAll("\\+", "").replaceAll("-", "");String nameStr = dataList.get(position).get("name");Toast.makeText(MainActivity.this, "=mobile:" + mobile + "=nameStr:" + nameStr, Toast.LENGTH_SHORT).show();}});}/*** 读取数据** @return 读取到的数据*/private List<Map<String, String>> getDataList() {// 1.获得ContentResolverresolver = getContentResolver();if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {}// 2.利用ContentResolver的query方法查询通话记录数据库/*** @param uri 需要查询的URI,(这个URI是ContentProvider提供的)* @param projection 需要查询的字段* @param selection sql语句where之后的语句* @param selectionArgs ?占位符代表的数据* @param sortOrder 排序方式*/Cursor cursor = resolver.query(callUri, // 查询通话记录的URIcolumns, null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示);// 3.通过Cursor获得数据List<Map<String, String>> list = new ArrayList<>();while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE));String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(dateLong));String time = new SimpleDateFormat("HH:mm").format(new Date(dateLong));int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));String dayCurrent = new SimpleDateFormat("dd").format(new Date());String dayRecord = new SimpleDateFormat("dd").format(new Date(dateLong));String typeString = "";switch (type) {case CallLog.Calls.INCOMING_TYPE://"打入"typeString = "打入";break;case CallLog.Calls.OUTGOING_TYPE://"打出"typeString = "打出";break;case CallLog.Calls.MISSED_TYPE://"未接"typeString = "未接";break;default:break;}if (MobileUtil.isMobileNO(number)) {String dayString = "";if ((Integer.parseInt(dayCurrent)) == (Integer.parseInt(dayRecord))) {//今天dayString = "今天";} else if ((Integer.parseInt(dayCurrent) - 1) == (Integer.parseInt(dayRecord))) {//昨天dayString = "昨天";} else {//前天dayString = "前天";}long day_lead = TimeStampUtil.compareDayTime(date);if (day_lead < 2) {//只显示48小时以内通话记录,防止通     //话记录数据过多影响加载速度Map<String, String> map = new HashMap<>();//"未备注联系人"map.put("name", (name == null) ? "未备注联系人" : name);//姓名map.put("number", number);//手机号map.put("date", date);//通话日期// "分钟"map.put("duration", (duration / 60) + "分钟");//时长map.put("type", typeString);//类型map.put("time", time);//通话时间map.put("day", dayString);//map.put("time_lead", TimeStampUtil.compareTime(date));//list.add(map);} else {return list;}}}return list;}
}

Adapter

public class ImpowerAdapter extends BaseAdapter {private Context context;private List<Map<String, String>> list;public ImpowerAdapter(Context context, List<Map<String, String>> list) {this.context = context;this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}private ImpowerCustomHolder holder;@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.slv_impower_item, parent, false);holder = new ImpowerCustomHolder();holder.ivImg = convertView.findViewById(R.id.iv_impower_item_img);holder.tvName = convertView.findViewById(R.id.tv_impower_item_name);holder.tvDuration = convertView.findViewById(R.id.tv_impower_item_duration);holder.tvTimeLead = convertView.findViewById(R.id.tv_impower_item_time_lead);convertView.setTag(holder);} else {holder = (ImpowerCustomHolder) convertView.getTag();}/*** 通话类型*/if (TextUtils.equals((list.get(position).get("type") + ""), "打入")) { //"打入"holder.ivImg.setImageResource(R.drawable.phone_receive);holder.tvDuration.setTextColor(context.getResources().getColor(R.color.primary_font_title));holder.tvDuration.setText(list.get(position).get("duration") + "");// 通话时长} else if (TextUtils.equals((list.get(position).get("type") + ""), "打出")) {  //"打出"holder.ivImg.setImageResource(R.drawable.phone_call);holder.tvDuration.setTextColor(context.getResources().getColor(R.color.primary_font_title));holder.tvDuration.setText(list.get(position).get("duration") + "");// 通话时长} else if (TextUtils.equals((list.get(position).get("type") + ""), "未接")) { //"未接"holder.ivImg.setImageResource(R.drawable.phone_no);holder.tvDuration.setTextColor(context.getResources().getColor(R.color.primary_red,null));holder.tvDuration.setText("未接通");// 通话时长} else {holder.ivImg.setImageResource(R.drawable.phone_no);holder.tvDuration.setTextColor(context.getResources().getColor(R.color.primary_red));holder.tvDuration.setText("未接通");// 通话时长}/*** 通话记录的联系人*/if (TextUtils.equals((list.get(position).get("name") + ""), "未备注联系人")) {// 通话记录的联系人holder.tvName.setText(list.get(position).get("number"));// 通话记录的联系人} else {holder.tvName.setText(list.get(position).get("name") + "(" + list.get(position).get("number") + ")");// 通话记录的联系人}holder.tvTimeLead.setText(list.get(position).get("day") + "  " + list.get(position).get("time"));// 通话距离return convertView;}class ImpowerCustomHolder {private ImageView ivImg;//图标private TextView tvName,//名字tvDuration,//时长tvTimeLead;//时间差}
}

主布局activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><ListViewandroid:id="@+id/slv_impower_item"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/primary_white"android:divider="@color/gray"android:dividerHeight="1dp" /></LinearLayout>

在清单文件中注册读取通话记录的权限:

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

最终效果图:

  • 源码: Android获取手机通话记录的方法

Android获取手机通话记录的方法相关推荐

  1. 通话记录查询Java_Android获取手机通话记录的方法

    Android如何获取手机通话记录,本文为大家揭晓. 获取手机通话记录流程: 1. 获取ContentResolver; ContentResolver resolver = getContentRe ...

  2. 删除的android电话怎么找回,通话记录删除了怎么恢复?安卓手机通话记录恢复方法...

    通话记录删除了怎么恢复?安卓手机通话记录恢复方法 2018年11月08日 17:35作者:黄页编辑:黄页 分享 我们和他人通话结束后,手机上会出现通话记录,但是要是不小心把这些通话记录删除了该怎么办? ...

  3. android通话记录手机号码归属地,mui 获取手机通话记录

    export default { onLoad() { this.log(); // this.msg(); // this.concat(); }, methods: { log() { // 获取 ...

  4. android p获取通话记录_[android] 取得最近通话记录的方法

    经过一下午的研究,终于弄明白了android中,关于通话记录取得的方法.下边是自己的一点心得. final Cursor cursor = cr.query(CallLog.Calls.CONTENT ...

  5. android系统通话记录,安卓手机通话记录怎么恢复?快速恢复

    原标题:安卓手机通话记录怎么恢复?快速恢复 安卓手机通话记录怎么恢复?我们的手机上只要打过电话,一定就会有手机通话记录,那么问题就出现了,若是我们不小心将我们我们的手机通话记录给删除了,我们又比较需要 ...

  6. android获取手机sim卡信息,Android获取手机SIM卡运营商信息的方法

    本文实例讲述了Android获取手机SIM卡运营商信息的方法,对于Android程序设计有非常实用的价值.分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: /** * 获取SIM卡运营商 ...

  7. android5.1本机号码,Android获取手机本机号码的实现方法

    Android获取手机本机号码的实现方法 反射TelephoneManager 获取本机号码,注意一下提供的接口有的SIM卡没写是获取不到的,该接口只适配Android5.0以上版本 public S ...

  8. android sim卡联系人存储格式,Android获取手机通讯录、sim卡联系人及调用拨号界面方法...

    android获取手机通讯录联系人信息 private void getPhoneContacts() { ContentResolver resolver = this.getContentReso ...

  9. 在计算机上知道手机密码,不知道密码查手机通话记录:傻瓜式教程

    不知道密码查手机通话记录:傻瓜式教程 搜狐媒体平台 05-14 09:12 大 有时我们不慎忘记了自己手机的服务密码,在这种情况下,是否还可以查询自己手机的通话记录呢?答案是可以的,今天我要介绍的方法 ...

最新文章

  1. Bitcoin.com| 比特币现金在澳大利亚的零售支出大幅超过BTC
  2. Java关键字系列(public,protected,private)
  3. SQL Server查询重复数据
  4. 功率谱有什么用_马达品牌不同,功率一样,变频器互相不能用,是什么原因
  5. concurrent: wai notify notifyAll
  6. Java虚拟机和Dalvik(android)虚拟机的区别
  7. 轻松入门CAS系列(1)-轻松看懂企业单点登录的解决方案
  8. idea新建web工程
  9. java中与接口类,Java中类与类、类与接口、接口与接口的关系
  10. python3.6.5下载安装教程_Ubuntu16.04安装python3.6.5步骤详解
  11. MAGENTO与性能优化
  12. 经典算法面试题目-翻转一个C风格的字符串(1.2)
  13. python数据结构-数组/列表/栈/队列及实现
  14. 聊聊即将过去的2020,想想即将到来的2021
  15. MapGIS考试大纲
  16. 计算机测试性评估,计算机CPU性能评估软件PCMark
  17. 【idea配置】idea右下角不显示版本分支
  18. Pareto最优解 Pareto分布
  19. Eclipse中pep8规范,修改每行字符长度
  20. android 登录注册动画,Android开发(14)——动画实战:炫酷登录

热门文章

  1. npm ERR code ELIFECYCLE解决方案
  2. zcmu--1199: 英雄无敌3(2)
  3. 利用Java操作Office2007成为可能
  4. 字典学习 (Dictionary Learning) —— K-SVD 算法
  5. SDL用法:PiratesHo!全集
  6. Deep Occlusion-Aware Instance Segmentation with Overlapping BiLayers笔记
  7. 如何让你的游戏性能转危为安?
  8. caffe在ubuntu12.04上的安装及配置
  9. ERROR conda.core.link:_execute(701);script output stdout:stderr: ‘chcp‘ ... return code: 1
  10. 输入阻抗、输出阻抗和阻抗匹配