当前位置: 首页 > news >正文

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?) {}})}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Verilog 数字系统设计教程】Verilog 基础:硬件描述语言入门指南
  • 登录校验组件 Spring Security OAuth2 详解
  • 【CVPR‘24】BP-Net:用于深度补全的双边传播网络,新 SOTA!
  • IOS 17 基于UITabBarController实现首页TabBar
  • 在URL链接中指定浏览器跳转到PDF文件的指定页码
  • python计算机视觉——第四章 照相机模型与增强现实
  • OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用
  • 基于 Householder 变换的 qr 分解 算法与源码实现
  • sdk监控平台
  • 14.JS学习篇-CSR和SSR
  • golang并发编程——概述
  • sql中exist和in的区别
  • 240828-Gradio结合Html+Css+Javascript制作年历
  • Open3D编译安装
  • 同人小游戏之斗罗大陆3
  • Android Studio:GIT提交项目到远程仓库
  • extract-text-webpack-plugin用法
  • gops —— Go 程序诊断分析工具
  • JavaScript 基本功--面试宝典
  • JavaScript对象详解
  • JavaScript学习总结——原型
  • JS函数式编程 数组部分风格 ES6版
  • Js基础知识(一) - 变量
  • Just for fun——迅速写完快速排序
  • rabbitmq延迟消息示例
  • Vue组件定义
  • 从0实现一个tiny react(三)生命周期
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 诡异!React stopPropagation失灵
  • 前端路由实现-history
  • 我从编程教室毕业
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Nginx实现动静分离
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​马来语翻译中文去哪比较好?
  • ​一些不规范的GTID使用场景
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # centos7下FFmpeg环境部署记录
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #Lua:Lua调用C++生成的DLL库
  • #pragma once与条件编译
  • (2)STL算法之元素计数
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (强烈推荐)移动端音视频从零到上手(上)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .NET 事件模型教程(二)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)