Android 获取通话记录

在某些App的开发者,获取通话记录有时候是必要的(现在都要申请相对于权限哦,App上架得说明为啥获取此权限)。

因为工作风控数据收集经常会用到,在此做个总结。

大致步骤

1.权限声明

2.申请权限

3.获取通话记录

4.生成列表数据上传

一、权限声明

manifest.xml

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

二、权限申请

使用EasyPermissions进行权限判断及申请

val CALL_LOG = 4if (EasyPermissions.hasPermissions(requireActivity(), android.Manifest.permission.READ_CALL_LOG)) {LogUtils.e("callInfo", CallUtils().getList(requireActivity() as AppCompatActivity).toString())} else {EasyPermissions.requestPermissions(this@HomeFragment,"需要获取对应权限才能保证功能正常使用",CALL_LOG,android.Manifest.permission.READ_CALL_LOG,)
}

记得你的activity或者fragment一定要继承EasyPermissions.PermissionCallbacks接口重写对应的方法。

override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {LogUtils.e("permission", "onPermissionsGranted $requestCode   perms$perms")if (requestCode == AppConstant.PER_CALL) {toCall()}else if (requestCode == AppConstant.CALL_LOG){LogUtils.e("callInfo", CallUtils().getList(requireActivity() as AppCompatActivity).toString())}}override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {LogUtils.e("permission", "onPermissionsDenied $requestCode   perms$perms")}override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)}

三、抓取通话记录

class CallUtils {@SuppressLint("Range")fun getList(mActivity: AppCompatActivity): List<RecordEntity>? {val contentResolver: ContentResolver = mActivity.contentResolvervar cursor: Cursor? = nulltry {cursor = contentResolver.query(CallLog.Calls.CONTENT_URI, null, null, null,CallLog.Calls.DATE + " desc")if (cursor == null) return nullval mRecordList: MutableList<RecordEntity> = ArrayList()while (cursor.moveToNext()) {val record = RecordEntity()record.name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME))record.telephoneNo = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER))record.callType = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE))record.callDate = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE))record.callDuration = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DURATION))LogUtils.e("call record", record.toString())mRecordList.add(record)}return mRecordList} finally {cursor?.close()}}}class RecordEntity {var name: String? = nullvar telephoneNo: String? = nullvar callType: Int = 0var callDate: Long = 0var callDuration: Long = 0override fun toString(): String {return "RecordEntity [toString()=$name,$telephoneNo,$callType,$callDate,$callDuration]"}
}

四、数据上传

得到list后,使用retrofit上传数据到服务端

  fun uploadCallLog(activity: AppCompatActivity, isUserClick: Boolean) {if (!AppConstant.getIsLogin()) returnval map: MutableMap<String, Any> = HashMap(16)val list = CallUtils().getList(activity)if (list != null) map["records"] = listRetrofitUtil.post(AppApi.UPLOAD_CALL_LOG, map.toMap(), object : RetrofitCallback() {override fun onSuccess(responseBody: BaseResponseBody) {}override fun onError(t: Throwable?, type: Int?) {}})}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LNMP环境搭建(Linux+nginx+Mysql+PHP)超详细攻略

目录 一.LNMP简介 1.1LNMP架构的特点 二.详细安装步骤 2.1MySQL安装 2.1-1Yum安装 2.1-2 编译安装 2.1-3二进制安装 2.1-4 RPM安装 2.2Nginx安装 2.2-1编译安装nginx 2.2-2yum安装nginx 2.3验证Nginx安装 2.4PHP安装 2.4-1编译安装PHP 2.4-2yum安装PHP 2.5 Nginx 配…

PMP–一、二、三模、冲刺、必刷–分类–14.敏捷–技巧--累积流图

文章目录 技巧一模二模三模14.敏捷–敏捷团队的衡量结果–累积流图&#xff1a;1、 敏捷项目的项目经理担心团队在最近的迭代中失去了动力。项目经理应该使用哪两种工具来分析团队绩效&#xff1f;&#xff08;选择两个&#xff09; 冲刺必刷7.成本管理--挣值分析燃尽图仅能了解…

Android --- observer和observerForever的区别

observe 和 observeForever 是 LiveData 中的两个方法&#xff0c;用于观察数据的变化&#xff0c;但它们在生命周期管理和适用场景上有区别&#xff1a; ---->observe: 用途: 注册一个观察者&#xff0c;该观察者在 LifecycleOwner&#xff08;如 Activity 或 Fragment&am…

From Man vs Machine to Man + Machine

From Man vs. Machine to Man Machine: The Art and AI of Stock Analyses 论文阅读 文章目录 From Man vs. Machine to Man Machine: The Art and AI of Stock Analyses 论文阅读 AbstractConstruction and Performance of the AI AnalystMethodologyThe Performance of Ana…

一款用于分析java socket连接问题的工具

network-tools 介绍 network-tools基于sun jdk、Oracle jdk开发&#xff0c;拦截基于java socket请求&#xff0c;它包括 ​ http 客户端 ​ jdbc 客户端 ​ mq 客户端 ​ redis 客户端 目前提供如下功能&#xff1a; ​ 最近端点连接情况 ​ 最近与远程端点连接情况&am…

【Windows】【C++】【Udp】 udp通信协议详解和示例

在 Windows 平台上&#xff0c;使用 C 实现的 UDP 通信服务器和客户端示例代码稍有不同&#xff0c;因为 Windows 使用 Winsock API 进行网络编程。下面是一个简单的 UDP 服务器和客户端的实现示例&#xff0c;包括详细的代码和说明。 UDP 服务器代码示例&#xff08;Windows&…

Mybatis分页查询主从表

先主查询&#xff0c;再关联子查询&#xff0c;不影响分页效果&#xff0c;否则子查询也会参与分页。 <resultMap id"Hdr" type"com.Hdr"><id column"crh_id" property"id" javaType"int"/><collection prop…

计算机网络 第1章 概述

文章目录 计算机网络概念计算机网络的组成计算机网络的功能三种数据交换技术电路交换&#xff08;Circuit Switching&#xff09;报文交换&#xff08;message&#xff09;分组交换 三种交换方式性能对比计算机网络的分类计算机网络的性能指标性能指标1&#xff1a;速率性能指标…

【优化】Nginx 配置页面请求不走缓存 浏览器页面禁用缓存

【优化】Nginx 配置页面请求不走缓存 禁用缓存 目录 【优化】Nginx 配置页面请求不走缓存 禁用缓存 对所有请求禁用缓存 对特定location禁用缓存 注意事项 全局禁用缓存 要配置Nginx使其不缓存内容&#xff0c;通常是指禁止浏览器缓存响应的内容&#xff0c;或者是在代理…

单片机-串口通信(二)

目录 一、串口概念 1.相关概念&#xff1a; 按数据传输方式分类&#xff1a; 按时钟分类 二、STM32F103ZET6中串口 USART特性&#xff1a; NRZ数据格式&#xff1a; 三、配置串口通信 查看硬件原理图 软件配置流程 USART相关的寄存器 新建my_usart1.c和my_usart1.h …

将Google Chrome或Microsoft Edge浏览器的地址栏隐藏的方法

将Google Chrome或Microsoft Edge浏览器的地址栏隐藏的方法 目标效果示范 我们以百度首页为例&#xff0c;普通模式启动的页面通常会显示地址栏&#xff0c;如下图所示&#xff1a; 而本文要实现的效果是隐去地址栏和书签栏&#xff08;如果有的话&#xff09;&#xff0c;无…

【conda】Conda 环境迁移指南:如何更改 envs_dirs 和 pkgs_dirs 以及跨盘迁移

目录 迁移概述一、conda 配置文件1.1 安装 Conda 后的默认目录设置1.2 查看当前 .condarc 配置 二、更改 Conda 的 envs_dirs 和 pkgs_dirs 设置2.1 使用 conda config 命令Windows 和 Linux 系统 2.2 手动编辑 .condarc 文件Windows 系统Linux 系统 2.3 验证设置 三、迁移 Con…

JDBC |封装JDBCUtils|PreparedStatement|事务|批处理|数据库连接池| Blob类型数据的读写|Apache—DBUtils简介

一.概述 在Java中&#xff0c;数据库存取技术可分为如下几类&#xff1a; JDBC直接访问数据库JDO技术&#xff08;Java Data Object&#xff09;第三方O/R工具&#xff0c;如Hibernate, Mybatis 等 JDBC是java访问数据库的基石&#xff0c;JDO, Hibernate等只是更好的封装了J…

交流耦合同相放大电路设计

1 简介 该电路在单电源供电时&#xff0c;可放大交流信号&#xff0c;并可对输出信号进行电平抬升&#xff0c;以使其集中于电源电压信号的二分之一处。 2 设计目标 2.1 输入 2.2 输出 2.3 电源 2.4 截止频率下限&#xff08;&#xff09; 2.5 截止频率上限&#xff08;&…

elementUI根据列表id进行列合并@莫成尘

本文章提供了elementUI根据列表id进行列合并的demo&#xff0c;效果如图&#xff08;可直接复制代码粘贴&#xff09; <template><div id"app"><el-table border :data"tableList" style"width: 100%" :span-method"objectS…

docker python 3.11 容器报错

1. OSError: libc.so.1: cannot open shared object file: No such file or directory 解决办法 Dockerfile文件中增加如下命令执行安装 RUN apt install libc-dev 2. ImportError: libGL.so.1: cannot open shared object file: No such file or directory 解决办法 Dock…

sqlite3的db.serialize方法:确保数据库操作串行化的利器

在Node.js中&#xff0c;sqlite3是一个广受欢迎的轻量级数据库库&#xff0c;它提供了一个简洁的API来与SQLite数据库进行交互。在进行数据库操作时&#xff0c;为了确保操作的串行化执行&#xff0c;避免并发问题&#xff0c;sqlite3提供了db.serialize方法。本文将深入解析db…

物联网之硬件元器件基础知识介绍、集成电路、电阻器、电容器、电感器、二极管、三极管、晶体管、连接器、传感器、开关、电源

MENU 前言电子元件采购网址三极管持续更新中 前言 序言 硬件元器件是电子设备和系统的基本构成部分&#xff0c;它们在电子产品的设计、制造和功能实现中起着至关重要的作用。 电阻器(Resistor) 功能&#xff1a;电阻器用于限制电流流过电路的流动&#xff0c;并分配电压。它们…

聊一下软件测试的组织与管理

目录 1&#xff0e;测试的过程及组织 (1)首先&#xff0c;测试人员要仔细阅读有关资料。 (2)为了保证测试的质量。 (3)代码会审 (4)单元测试 (5)集成测试 (6)验收测试 2&#xff0e;测试方法的应用 3&#xff0e;测试的人员组织 (1)软件的设计和实现都是基于需求分…