安卓APP通话记录与录音上传踩坑记录






最近开发内部人员软件项目有个新需求,拿到本机通话记录以及通话录音文件,然后上传到服务器。开始接到这个需求的时候觉得很简单,不就是获取数据,匹配数据,上传数据那一套流程嘛,但是我实际深入进来的时候发现好多坑。由于之前没怎么深入开发过安卓APP,所以踩了很多坑,也是花了好几天时间加上AI分析我才搞定。


就把这几天踩过的坑都记录一下分享出来,下次遇到了可以有效解决,这里只记录思路,具体代码就不赘述了。


做通话录音上传,核心不是简单申请权限后读取文件。本地测试时,很多情况下只申请权限并不能稳定拿到通话记录或录音文件,尤其是 Android 真机环境。通常需要结合原生 Java 能力、打包自定义基座、真机调试来完成。


1. 准备原生能力


通话录音相关能力很多不是纯前端 API 能稳定解决的,尤其包括:


监听通话状态
获取系统通话记录
扫描本地录音文件
读取部分受限目录
处理 Android 厂商差异

所以需要写 Android 原生插件或原生模块,通过 Java 调用系统能力,再暴露给前端使用。


2. 打包自定义基座


本地 H5 或普通运行环境无法测试完整链路。


需要把原生插件打进自定义基座,然后在真机上运行。


大致流程是:


编写 Android 原生插件
配置 manifest 权限
打包自定义基座
安装到真机
前端调用原生插件能力
查看真机日志

这一步很关键。没有自定义基座,很多原生能力不会生效。


3. 申请必要权限


运行时需要申请权限,但权限只是前置条件,不代表一定能拿到数据。


常见权限包括:


READ_PHONE_STATE
READ_CALL_LOG
READ_EXTERNAL_STORAGE
READ_MEDIA_AUDIO
MANAGE_EXTERNAL_STORAGE

还要注意:


Android 版本不同,权限策略不同,部分权限需要跳系统设置页手动开启,所有文件访问权限不是普通弹窗权限,厂商系统可能把权限入口放在不同位置。


4. 获取通话记录


权限通过后,通过 Java 读取系统通话记录。


主要拿到这些信息:


号码
联系人
通话类型
通话开始时间
通话时长
这些数据用于后面和录音文件做匹配。

5. 扫描录音文件


录音文件通常不在通话记录里,需要单独扫描。


扫描方式一般包括:


扫描常见厂商录音目录
通过 MediaStore 查询音频文件
允许用户手动设置录音目录

需要拿到:


文件路径
文件名
文件大小
修改时间
录音时长

6. 匹配通话和录音


通话记录和录音文件需要自己匹配。


常见匹配依据:


手机号
通话开始时间
通话时长
录音文件名
录音文件修改时间

一般不能只靠单一字段,最好结合号码和时间窗口来判断。


7. 判断是否可上传


匹配到录音后,调用后端接口判断这条通话是否允许上传。


如果后端返回可上传所需信息,则允许继续上传;如果没有返回有效信息,则前端显示不可上传。


8. 上传录音文件


先把本地录音文件上传到文件服务,拿到文件地址或文件 ID。


本地录音文件 -> 文件上传接口 -> 文件 URL
这一步只代表文件上传成功,不代表业务录音提交成功。


9. 提交录音数据


拿到文件地址后,再调用业务接口提交录音信息。


通常包括:


手机号
通话类型
通话时长
通话唯一标识
录音文件地址
后端查询接口返回的业务字段

10. 记录上传状态


最后要记录本地状态,避免重复上传。


常见状态:


未上传
已上传
上传失败
不可上传

同时建议保存唯一标识,例如:


手机号 + 通话时间 + 通话类型
用于判断同一条通话是否已经处理过。


总结流程


完整链路可以概括为:


写 Java 原生能力
打包自定义基座
真机安装调试
申请电话和文件权限
读取系统通话记录
扫描本地录音文件
匹配通话和录音
调用接口判断是否可上传
上传录音文件
提交录音业务数据
缓存上传状态

这类功能的重点是:必须真机 + 原生能力 + 自定义基座调试。只靠前端申请权限,通常无法稳定完成通话录音获取和上传。