当前位置:首页 > 行业动态 > 正文

安卓发送语音至服务器

权限配置与申请

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:如何实现实时语音上传(边录边传)?

解答

安卓发送语音至服务器  第1张

  1. 使用 MediaRecordersetOutputDataSource 方法,将输出流指向网络连接。
  2. 通过 Socket 或 WebSocket 建立长连接,实时传输音频数据。
  3. 注意流量控制和网络稳定性,建议分包传输并添加校验机制。

问题 2:如何处理长时间录音导致的内存泄漏?

解答

  1. 及时释放资源:在 onDestroyonStop 中调用 mediaRecorder.release()
  2. 弱引用持有:避免 Service 或 Activity 对录音对象强引用。
  3. 分时段录音:将长时间录音拆分为多个小文件(如每分钟一个文件)。
0