上一篇
安卓发送语音至服务器
- 行业动态
- 2025-04-22
- 5
权限配置与申请
AndroidManifest.xml 声明权限
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" />
动态申请权限(Android 6.0+)
// 检查并请求权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_CODE); }
录音功能实现
创建 MediaRecorder
实例
MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 麦克风采集 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); // 编码格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 音频编码 mediaRecorder.setOutputFile(filePath); // 保存路径(需申请存储权限)
开始录音与停止录音
// 开始录音 mediaRecorder.prepare(); mediaRecorder.start(); // 停止录音 mediaRecorder.stop(); mediaRecorder.release();
音频数据处理与压缩
编码格式 | 特点 | 适用场景 |
---|---|---|
WAV | 无损压缩,文件大 | 高质量语音 |
AMR-NB | 低复杂度,文件小 | 实时语音传输 |
MP3 | 高压缩比,兼容性好 | 通用音频存储 |
压缩工具推荐
- LAME for MP3:开源 MP3 编码库。
- FFmpeg:支持多种音视频格式转换。
上传音频至服务器
使用 OkHttp
上传文件
OkHttpClient client = new OkHttpClient(); File file = new File(filePath); RequestBody requestBody = new MultipartBody.Builder() .addFormDataPart("file", file.getName(), RequestBody.create(file, MediaType.parse("audio/amr"))) .build(); Request request = new Request.Builder() .url("https://yourserver.com/upload") .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 上传失败处理 } @Override public void onResponse(Call call, Response response) throws IOException { // 上传成功处理 } });
关键参数说明
参数 | 作用 |
---|---|
filePath |
本地音频文件路径 |
audio/amr |
MIME 类型(根据实际编码调整) |
https://yourserver.com/upload |
服务器接口地址 |
后台服务与线程管理
使用 Service
实现后台录音
public class RecordingService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // 启动录音逻辑 return START_STICKY; } }
异步处理录音与上传
- 子线程录音:避免阻塞主线程。
- Handler 或 Coroutine:更新 UI 或处理回调。
常见问题与解决方案
问题 | 解决方案 |
---|---|
权限被拒 | 引导用户手动开启权限 |
录音文件过大 | 缩短录音时长或提高压缩率 |
上传失败 | 添加重试机制(如指数退避) |
相关问题与解答
问题 1:如何实现实时语音上传(边录边传)?
解答:
- 使用
MediaRecorder
的setOutputDataSource
方法,将输出流指向网络连接。 - 通过
Socket
或 WebSocket 建立长连接,实时传输音频数据。 - 注意流量控制和网络稳定性,建议分包传输并添加校验机制。
问题 2:如何处理长时间录音导致的内存泄漏?
解答:
- 及时释放资源:在
onDestroy
或onStop
中调用mediaRecorder.release()
。 - 弱引用持有:避免 Service 或 Activity 对录音对象强引用。
- 分时段录音:将长时间录音拆分为多个小文件(如每分钟一个文件)。