# recording-app **Repository Path**: bylist/recording-app ## Basic Information - **Project Name**: recording-app - **Description**: 通过AudioRecord和AudioTrack实现的录音小程序 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-30 - **Last Updated**: 2025-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 录音机 Android 项目 基于 Android 原生 `AudioRecord`(录音)和 `AudioTrack`(播放)实现的录音机 App,支持核心的录音、播放、停止功能,适配 Android 6.0+ 动态权限,代码可直接作为Android 音频开发模板。 ## 一、项目介绍 ### 1. 核心定位 本项目聚焦「Android 原生音频开发」,无第三方音频库依赖,实现轻量级录音/播放功能,兼顾易用性与设计还原度,适合 Android 开发者学习音频 API 及跨平台 UI 适配。 ### 2. 核心特点 | 功能/特性 | 详情 | |-------------------------|----------------------------------------------------------------------| | 音频核心 | 基于 `AudioRecord` 录制 PCM 音频、`AudioTrack` 实时播放,无文件存储依赖 | | UI 风格 | 大圆角按钮、磨砂玻璃卡片、iOS 标准蓝色(#007AFF) | | 交互体验 | iOS 风格按压反馈、居中 Toast 提示、禁用按钮浅灰态,贴合 iOS 交互习惯 | | 兼容性 | 适配 Android 6.0+(动态权限)、兼容主流 Android 设备 | | 性能优化 | 子线程处理音频读写、volatile 保证线程安全、页面销毁自动释放资源 | ## 二、技术栈 - 开发语言:Java(Android 原生) - 核心 API:`AudioRecord`、`AudioTrack`(Android 多媒体音频) - UI 布局:`ConstraintLayout`(精准布局)、`CardView`(磨砂玻璃卡片实现) - 样式控制:Drawable Selector(iOS 按钮按压/禁用状态)、自定义 Style - 权限处理:Android 6.0+ 动态权限申请(RECORD_AUDIO) - 其他:Handler 主线程更新 UI、多线程状态同步 ## 三、环境要求 1. 开发工具:Android Studio Arctic Fox 及以上版本(建议 2022.3.1+) 2. Gradle 版本:7.0+(支持 Version Catalog 依赖管理) 3. SDK 配置: - minSdkVersion:23(Android 6.0) - targetSdkVersion:33+ - compileSdkVersion:33+ 4. 权限:录音权限(RECORD_AUDIO)(Android 6.0+ 需动态申请) ## 四、安装与运行 ### 1. 拉取/下载代码 ```bash # 克隆仓库(若托管在 Git 仓库) git clone [仓库地址] # 或直接下载 ZIP 包,解压后用 Android Studio 打开 ``` ### 2. 项目配置 1. 打开 Android Studio,选择「Open」→ 选中项目根目录; 2. 等待 Gradle 同步完成(首次同步需联网下载 CardView/ConstraintLayout 依赖); 3. 检查 `gradle/libs.versions.toml` 依赖版本是否完整(已配置 iOS 风格所需控件); 4. 连接 Android 真机/启动模拟器(开启开发者模式 + USB 调试)。 ### 3. 运行项目 点击 Android Studio 顶部「Run」按钮(绿色三角),选择目标设备,等待编译运行完成。 ## 五、核心功能使用说明 | 操作 | 效果 | |---------------------|----------------------------------------------------------------------| | 点击「开始录制」按钮 | 启动录音,按钮禁用、「停止录制」按钮启用,状态文本显示「正在录制...」 | | 点击「停止录制」按钮 | 停止录音,按钮禁用、「播放录音」按钮启用,状态文本显示录制完成(帧数据数) | | 点击「播放录音」按钮 | 播放录制的音频,按钮禁用、「停止播放」按钮启用,状态文本显示「正在播放...」 | | 点击「停止播放」按钮 | 中断音频播放,按钮禁用、「播放录音」按钮恢复可用,状态文本显示「播放已停止」 | ## 六、核心实现要点 ### 1. 音频参数一致性(关键) 录制/播放参数完全对齐,避免播放失真/无声,采用 iOS 录音机通用参数: ```java // iOS 录音机标准音频参数 private static final int SAMPLE_RATE = 44100; // 采样率 44100Hz private static final int CHANNEL_CONFIG_IN = AudioFormat.CHANNEL_IN_MONO; // 单声道录制 private static final int CHANNEL_CONFIG_OUT = AudioFormat.CHANNEL_OUT_MONO; // 单声道播放 private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; // 16位 PCM 编码 ``` ### 2. iOS 风格 UI 核心 | iOS 设计特征 | Android 实现方式 | |-----------------------|-----------------------------------------------------------------------| | 大圆角按钮 | Drawable 设置 `corners android:radius="25dp"`(按钮高度的一半) | | iOS 标准蓝色 | 强调色按钮背景色设为 `#007AFF`,按压态 `#0066CC` | | 磨砂玻璃卡片 | CardView 设置 `cardCornerRadius="16dp"` + 低高度阴影(elevation="2dp") | | 字体适配 | 用 `sans-serif-medium` 替代 iOS SF Pro 字体,文本大小 17sp(iOS 按钮标准) | | 居中 Toast | 自定义 Toast 位置为 `Gravity.CENTER`,背景适配 iOS 浅灰风格 | | 间距规范 | 布局 margin/padding 采用 8/16/24dp 倍数(iOS 设计系统标准) | ### 3. 线程安全与资源管理 - 用 `volatile` 标记 `isRecording`/`isPlaying`,保证多线程状态可见性; - 录音/播放逻辑放在子线程,避免主线程 ANR; - `onDestroy` 中强制释放 `AudioRecord`/`AudioTrack`,防止设备资源占用; - 禁用按钮时适配 iOS 浅灰禁用色(`#D1D1D6`),文本色 `#8E8E93`。 ## 七、扩展方向(进阶) 本项目为基础版,可扩展以下功能适配完整 iOS 录音机: 1. **音频文件保存**:将 PCM 数据转码为 WAV/MP3 格式,保存至本地(iOS 录音机默认保存 m4a); 2. **录音列表**:添加 `UITableView` 风格的 `RecyclerView`,实现 iOS 侧滑删除、下拉刷新; 3. **波形图展示**:基于录制的 PCM 数据绘制 iOS 风格音频波形; 4. **深色模式**:添加 `values-night` 目录,适配 iOS 深色模式配色(黑色基底+蓝色强调); 5. **AirPods 适配**:检测蓝牙音频设备,自动切换播放声道; 6. **录音时长统计**:添加 iOS 风格的录制时长计时器(00:00 格式); 7. **分享功能**:集成 iOS 风格分享面板,支持分享录音文件。 ## 八、注意事项 1. **权限必须授予**:Android 6.0+ 需手动授予录音权限,否则「开始录制」按钮禁用; 2. **按钮圆角适配**:按钮高度需与圆角半径匹配(如 50dp 高度对应 25dp 圆角),保证正圆/纯圆角效果; 3. **字体兼容性**:部分 Android 设备无 `sans-serif-medium` 字体,可替换为 `sans-serif` 保证显示; 4. **测试建议**:优先用真机测试(模拟器音频功能易异常,且 iOS 风格 UI 还原度真机更高); 5. **资源释放**:退出 App 前需停止录音/播放,避免麦克风/扬声器被占用。 ## 九、常见问题 | 问题 | 解决方案 | |---------------------|--------------------------------------------------------------------------| | 按钮无按压反馈 | 检查 Drawable Selector 状态是否配置正确(`state_pressed`) | | iOS 蓝色显示偏色 | 调整颜色值为 `#007AFF`(iOS 官方标准),避免设备色域差异导致偏紫/偏绿 | | 磨砂卡片阴影过重 | 降低 CardView 的 `elevation` 至 1-2dp,开启 `cardUseCompatPadding` | | 播放无声音 | 1. 检查音频参数是否一致;2. 确认 `AudioTrack` 调用 `play()` 方法 | | Toast 样式不匹配 | 自定义 Toast 背景为 `ios_btn_bg.xml`,调整文本内边距适配 iOS 风格 |