文章目录

  • 1、简介
  • 2、代码结构
  • 3、activity_main.xml 布局文件
  • 4、AndroidManifest.xml 添加权限
  • 5、MainActivity .java 功能文件
  • 6、获取联系人数据库
  • 7、根据手机号码查询联系人的姓名

1、简介

获取通话记录的信息

log 提示:

2、代码结构

1)mainActivity.java 功能文件
2)AndroidManifest.xml 添加相关权限
3)activity_main.xml 布局文件

3、activity_main.xml 布局文件

添加一个button

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/but_id"android:text="按钮"android:textSize="50dp"/>

4、AndroidManifest.xml 添加权限

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

5、MainActivity .java 功能文件

package recognizerdemo.speech.baidu.com.mycalllog;import android.Manifest;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CallLog;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private String TAG  = "MainActivity: ";private List<String> unPermissionList = new ArrayList<String>(); //申请未得到授权的权限列表private AlertDialog mPermissionDialog;private String mPackName ;  //获取 a'p'k 包名private Button button;private String[] permissionList = new String[]{    //申请的权限列表Manifest.permission.READ_CALL_LOG,Manifest.permission.WRITE_CALL_LOG};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};// 通话类型}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);checkPermission();  //检查权限addCallLOg(); //添加一个通话记录button = (Button) findViewById(R.id.but_id);button.setOnClickListener(this);}//权限判断和申请public void checkPermission() {unPermissionList.clear();//清空申请的没有通过的权限//逐个判断是否还有未通过的权限for (int i = 0; i < permissionList.length; i++) {if (ContextCompat.checkSelfPermission(this, permissionList[i]) !=PackageManager.PERMISSION_GRANTED) {unPermissionList.add(permissionList[i]);//添加还未授予的权限到unPermissionList中}}//有权限没有通过,需要申请if (unPermissionList.size() > 0) {ActivityCompat.requestPermissions( this,permissionList, 100);Log.i(TAG, "check 有权限未通过");} else {//权限已经都通过了,可以将程序继续打开了Log.i(TAG, "check 权限都已经申请通过");}}/*** 5.请求权限后回调的方法** @param requestCode  是我们自己定义的权限请求码* @param permissions  是我们请求的权限名称数组* @param grantResults 是我们在弹出页面后是否允许权限的标识数组,数组的长度对应的是权限*                     名称数组的长度,数组的数据0表示允许权限,-1表示我们点击了禁止权限*/@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);Log.i(TAG,"申请结果反馈");boolean hasPermissionDismiss = false;if (100 == requestCode) {for (int i = 0; i < grantResults.length; i++) {if (grantResults[i] == -1) {hasPermissionDismiss = true; //有权限没有通过Log.i(TAG,"有权限没有被通过");break;}}}if (hasPermissionDismiss) {//如果有没有被允许的权限showPermissionDialog();} else {//权限已经都通过了,可以将程序继续打开了Log.i(TAG, "onRequestPermissionsResult 权限都已经申请通过");}}/*** 不再提示权限时的展示对话框*/private void showPermissionDialog() {Log.i(TAG,"mPackName: " + mPackName);if (mPermissionDialog == null) {mPermissionDialog = new AlertDialog.Builder(this).setMessage("已禁用权限,请手动授予").setPositiveButton("设置", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {cancelPermissionDialog();Uri packageURI = Uri.parse("package:" + mPackName);     //去设置里面设置Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);startActivity(intent);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//关闭页面或者做其他操作cancelPermissionDialog();}}).create();}mPermissionDialog.show();}private void cancelPermissionDialog() {mPermissionDialog.cancel();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.but_id:Log.i(TAG,"clock button");getContentCallLog();break;default:break;}}private void addCallLOg() {  //添加通话记录Log.i(TAG,"添加通话 alog");ContentValues values = new ContentValues();values.clear();values.put(CallLog.Calls.CACHED_NAME, "lum");values.put(CallLog.Calls.NUMBER, 123456789);values.put(CallLog.Calls.TYPE, "1");
/*        values.put(CallLog.Calls.DATE, calllog.getmCallLogDate());values.put(CallLog.Calls.DURATION, calllog.getmCallLogDuration());*/values.put(CallLog.Calls.NEW, "0");// 0已看1未看 ,由于没有获取默认全为已读getContentResolver().insert(CallLog.Calls.CONTENT_URI, values);}//获取通话记录private void getContentCallLog() {Cursor cursor = getContentResolver().query(callUri, // 查询通话记录的URIcolumns, null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示);Log.i(TAG,"cursor count:" + cursor.getCount());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)); //获取通话类型:1.呼入2.呼出3.未接String dayCurrent = new SimpleDateFormat("dd").format(new Date());String dayRecord = new SimpleDateFormat("dd").format(new Date(dateLong));Log.i(TAG,"Call log: " + "\n"+ "name: " + name +"\n"+ "phone number: " + number  + "\n");}}
}

6、获取联系人数据库

我们知道手机联系人通话记录是两张不同的数据表保存的

添加联系人权限

    <uses-permission android:name="android.permission.READ_CONTACTS"/><!-- 读取手机联系人权限 --><uses-permission android:name="android.permission.CALL_PHONE" />

这个会获取手机里面联系人的姓名 、手机号,注意 手机号码再数据库里的保存格式
比如:
1-123-456-7890

//获取联系人private void getConnect() {Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,new String[] { "display_name", "sort_key", "contact_id","data1" }, null, null, null);Log.i(TAG,"cursor connect count:" + cursor.getCount());
//        moveToNext方法返回的是一个boolean类型的数据while (cursor.moveToNext()) {//读取通讯录的姓名String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));//读取通讯录的号码String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));Log.i(TAG,"获取的通讯录是: " + name + "\n"+  " number : " + number);}cursor.close();}

7、根据手机号码查询联系人的姓名

  private   String[] projection = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER };//根据手机号码查询联系人姓名private void getConName() {String displayName;Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection,ContactsContract.CommonDataKinds.Phone.NUMBER + "=?",new String[]{"1-123-456-7890"}, null);Log.i(TAG,"cursor displayName count:" + cursor.getCount());if (cursor != null) {while (cursor.moveToNext()) {displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));if (!TextUtils.isEmpty(displayName)) {Log.i(TAG,"获取的通讯录 姓名是 : " + displayName);break;}}}}

文件参考:
Android获取手机通话记录的方法
https://blog.csdn.net/qq_36158551/article/details/83829659

Android通过ContentProvider获取通话记录
https://blog.csdn.net/qq_34858228/article/details/69446911

android 读取手机通话记录
https://blog.csdn.net/fengpeihao/article/details/77749627

Android开发之获取通话记录
https://blog.csdn.net/monkey988/article/details/77529940/

Android 获取通话记录、联系人相关推荐

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

    Android 获取通话记录和短信内容 一.获取通话记录 1.权限声明,需要在Manifest.xml文件中声明权限(读取通话记录权限): <uses-permission android:na ...

  2. Android获取通话记录的未接来电、自定义通知栏事件处理

    此文非教程,作常用工具类记录,因此主要是代码--- --前言 公司项目有这么一个需求,获取用户的通话记录,如果存在24小时内的未接来电则发送状态栏通知,通知上除了可以直接回拨还可以及引导用户打开app ...

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

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

  4. android 获取通话记录不准确(为上次记录)

    问题: 使用 new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange, Uri uri ...

  5. Android获取通话记录

    Android中获取手机中的通话记录还是挺简单的.可以通过content provide来直接获取数据库中的内容... 注:该代码需要用到上下文context.. Cursor cursor = co ...

  6. Android小米(miui)获取通话记录为null解决办法

    Android小米(miui)获取通话记录为null解决办法 在开发中发现,查询通话记录时使用 contentResolver.query( CallLog.Calls.CONTENT_URI, Co ...

  7. uniapp通讯录等敏感权限检查、申请。获取通话记录等内容

    本篇文章是我对我搜集到的相关方面的一些整合希望可以帮助到大家. plus.android.requestPermissions([Permission], //所需申请权限名称,可以是数组functi ...

  8. uni-app获取通话记录 自定义基座打包能成功获取

    // 获取通话记录var CallLog = plus.android.importClass("android.provider.CallLog");var main = plu ...

  9. request获取int类型的值_获取通话记录或通讯录的数量为负值

    安卓源码避坑指南5--获取通话记录或通讯录的数量为负值 通过蓝牙PBAP协议同步通讯录.通话记录时,想必对其数量大小也是很感兴趣的,因此一般的设计思路都是先获取到同步对象的总大小,然后再同步该对象的具 ...

最新文章

  1. css的background
  2. 万字长文,值得收藏/参考的OpenCV C++基础代码
  3. SpringBoot项目redis的消息队列
  4. 2020知到python语言应用答案_2020年知到APPPython语言应用第四单元章节测试答案
  5. linux临时挂载别的文件目录_linux基础05:linux系统目录有哪些?命令行界面如何切换目录?...
  6. 分类和回归的区别和联系
  7. NFS介绍,NFS服务端安装配置,NFS配置选项
  8. python新手难点_汇总初学python时的28个操作难点(新手必看篇)
  9. 如何在没有域的环境中搭建AlwaysOn(二)
  10. ecshop二次开发之模板整合
  11. 场景二:刮刮卡,大转盘等抽奖算法
  12. 计算机小知识140,电脑小知识140个小技巧(7)
  13. Visual Studio/AnkhSVN在VS中出现SVN代码冲突的解决方法
  14. ansible从入门到放弃
  15. MC9S12XS128硬件底层驱动_set_bus_clk.h(总线时钟设置)
  16. 自由幻想系统不能提供服务器,系统指南-自由幻想召集令-QQ自由幻想官方网站...
  17. 1343: 平方和与立方和
  18. 零编程无屏幕,这款电子拼图机器人降低了STEM教育的学习门槛
  19. VR全景打造透明农业后花园,帮助农业走出乡村
  20. 推荐一款免费又好用的客户管理软件

热门文章

  1. ue4 角色奔跑/冲刺/蹲下 /蹲走 动作切换蓝图
  2. AI如何影响智能交互
  3. 视频编辑大师:Movavi Video Editor 15 Business Mac
  4. BPEL 及其发展历程
  5. Java开发入门与实战!java电子书教材下载
  6. linux开源调色软件,五款可以代替Lightroom的专业调色软件,值得一用
  7. Android控件之AutoCompleteTextView、MultiAutoCompleteTextView探究
  8. 2019年12月PAT甲级 第三题 Summit(1166)题解
  9. 日立服务器硬盘沈阳代理,日立(Hitachi)企业级硬盘全系列扫描
  10. AVI音视频封装格式学习(二)——AVI RIFF文件参考