android 查询不同机型通话记录信息

news/2025/2/12 14:09:42/

需求:实现通话记录和短信同步,需要对应手机卡槽ID。

 public List<CallRecordsEntity> getPhoneList(Context context) {try {Map<Integer, Integer> simInfo = BaseApp.getInstance().getSimInfo();ContentResolver contentResolver = context.getContentResolver();//调用query方法,传入URI参数,即CallLog.Calls.CONTENT_URI//本节希望读取电话号码与事件两个字段,传入一个包含字段名的数组Cursor cursor = contentResolver.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls._ID,CallLog.Calls.NUMBER,// 通话记录的电话号码CallLog.Calls.DATE,// 通话记录的日期CallLog.Calls.DURATION,// 通话时长CallLog.Calls.TYPE, // 通话类型"simid"// 卡槽ID}, null,null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示);if (null == cursor) {LogUtils.e("TAG_通话记录", "无通话记录");return null;}//系统拨出通话记录集合List<CallRecordsEntity> systemList = new ArrayList<>();while (cursor.moveToNext()) {@SuppressLint("Range") int simid = cursor.getInt(cursor.getColumnIndexOrThrow("simid"));int slot_id = simInfo.containsKey(simid) ? simInfo.get(simid) : -1;//-1为以前插入的卡现在已经移除了 0为卡槽1 1为卡槽2 ...@SuppressLint("Range") int type = cursor.getInt(cursor.getColumnIndexOrThrow(CallLog.Calls.TYPE));//传入(1),传出(2)和错过(3),4(语音邮件),5(拒绝)和6(拒绝列表)@SuppressLint("Range") String number1 = cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.NUMBER));
//                LogUtils.e("TAG_获取系统通话记录", "number=" + number1+";slot_id="+slot_id);//只获取卡槽一if (slot_id == 0) {long l = System.currentTimeMillis();long stateTime= Long.parseLong(cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.DATE)));Long num = (l - stateTime)/86400000;//时间戳相差的毫秒数
//                    LogUtils.e("TAG_通话记录相差时间="+num);if (num <= 30){@SuppressLint("Range") String id = cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls._ID));@SuppressLint("Range") String number = cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.NUMBER));@SuppressLint("Range") int duration = cursor.getInt(cursor.getColumnIndexOrThrow(CallLog.Calls.DURATION));CallRecordsEntity systemEntity = new CallRecordsEntity();systemEntity.setCallId(Long.valueOf(id));systemEntity.setNumber(number);systemEntity.setStartTime(stateTime);systemEntity.setDuration(duration);systemEntity.setType(type);systemList.add(systemEntity);
//                        LogUtils.e("TAG_获取卡槽集合", "systemEntity="+systemEntity.toString());}else {return systemList;}}}return systemList;} catch (NumberFormatException e) {e.printStackTrace();ToastUtil.showToast("无法匹配卡一通话清单!");}return null;}

根据SimInfo获取卡槽信息,比对后,卡槽0对应卡槽1,自测后数据获取完整。

测试机为小米手机。

结果交给客户使用后,华为、vivo、OPPO、锤子都出现闪退现象。日志抓取后,发现部分机型无法获取simid。

通过不同机型录音文件的存储路径不同,猜测不同机型的simid命名不同。

public void editToFile(String str){File file = new File(Environment.getExternalStorageDirectory(), "fileOut.txt");LogUtils.e("TAG_记录file="+file);try{BufferedWriter writer = new BufferedWriter(new FileWriter(file,true));writer.write(str);writer.newLine();writer.flush();writer.close();}catch (IOException e) {e.printStackTrace();}}public void getCallLogs(){StringBuffer buffer = new StringBuffer();final String[] projection = null;final String selection = null;final String[] selectionArgs = null;final String sortOrder = "DATE DESC";Cursor cursor = getContentResolver().query(Uri.parse("content://call_log/calls"),projection,selection,selectionArgs,sortOrder);int j=0;//mEdit is EditTextif (cursor != null) {int L=cursor.getColumnCount();for(int i=0;i<L;i++)buffer.append(cursor.getColumnName(i) + "\t");buffer.append("\n");while (cursor.moveToNext()) {j++;if(j>=5)break;for(int i=0;i<L;i++){String callField = cursor.getString(i);buffer.append(callField + "\t");}buffer.append("\n");}}editToFile(buffer.toString());}

通过上面代码可以获取本地通话清单所有字段,文件存储路径为根目录下:fileOut.txt。比对发现,锤子手机确实没有simid这个字段,而小米手机有。

华为、vivo、OPPO暂无测试机进行测试,有遇到相同问题的小伙伴可以测试后将结果告知与我,感谢


http://www.ppmy.cn/news/862598.html

相关文章

Linux文件

目录 系统级I/O 简介 接口 文件描述符fd 重定向 缓冲区 文件系统 软硬链接 动静态库 静态函数库 动态库 系统级I/O 简介 输入/输出&#xff08;I/O&#xff09;是在主存和外部设备&#xff08;磁盘驱动器、终端和网络&#xff09;之间复制数据的过程。输入操作是…

查询通话详单

j题目来源&#xff1a;牛客网编程之美栏目 登录中国联通网上营业厅 /电信/移动 后选择「自助服务」 --> 「详单查询」&#xff0c;然后选择你要查询的时间段&#xff0c;点击「查询」按钮&#xff0c;查询结果页面的最下方&#xff0c;点击「导出」&#xff0c;就会生成类…

2023/7/13 platform实现中断,led,终端输出变量

platform驱动实现 1.使用驱动代码实现如下要求 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变&#xff08;按键中断) 例如number0按下按键number1 ,再次按下按键numberOd .在按下按键的时候需要同时将led1…

MySQL数据库表数据的基本操作

目录 1.创建表 2.插入数据 3.修改表数据 3.1、将所有员工薪水修改为5000元 ​3.2、将姓名为张三的员工薪水修改为3000元 ​3.3、将姓名为李四的员工薪水修改为4000元gender改为女 ​3.4、将王五的薪水在原有基础上增加1000元 4、MySQL字符集 1.创建表 创建员工表emplo…

渗透测试 ( 3 ) --- Metasploit Framework ( MSF )

白嫖 Metasploit Pro 2022&#xff1a;https://zhuanlan.zhihu.com/p/449836479 白嫖 Metasploit Pro 2022&#xff1a;http://t.zoukankan.com/hxlinux-p-15787814.html 好东西之 metasploit pro&#xff1a;https://www.52pojie.cn/thread-1586222-1-1.html Metasploit Pro 英…

Ubuntu 8.04 优化设置

文章中部分TIGER修改Ubuntu 8.04 LTS(长期支持版)免费光盘已经接受预定! https://shipit.ubuntu.com/ 有刻录机的最好自己刻盘,体谅人家.总纲&#xff1a;分以下几部分工作 (更新截至4月27日&#xff0c;决定停止更新&#xff0c;文章写长了就没意思了&#xff0c;眼花&#xf…

Qt/C++编写物联网管理平台21-探测器管理

一、前言 探测器在整个系统中是最核心的关键的硬件&#xff0c;终端节点硬件&#xff0c;安装有探测芯片装置&#xff0c;负责探测前端对应气体浓度&#xff0c;并记录值&#xff0c;等待控制器轮训数据回复&#xff0c;控制器信息表也是字段最多的&#xff0c;要存储位号、控…

ZOOM H1n录音笔怎么连接电脑做音频输入麦克风【教程】

一、ZOOM 录音笔连接电脑做音频输入麦克风&#xff0c;以H1n为例 以前试过用usb连接&#xff0c;但是发现音质不对。又试过用公对公3.5mm接头连接电脑麦口和录音笔耳机输出口&#xff0c;一顿操作猛如虎&#xff0c;一听音质超级糊。 因为买的不是国行 &#xff08;不知道有没…