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

安卓发送语音到服务器

权限申请

安卓系统需要动态申请敏感权限(录音、存储、网络),确保应用有权限访问麦克风和网络。

关键代码:

// 检查并请求权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED ||
    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
    ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{
        Manifest.permission.RECORD_AUDIO,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.INTERNET
    }, REQUEST_CODE_PERMISSION);
}

音频录制

使用 MediaRecorder 录制音频,保存为临时文件(如WAV格式)。

关键代码:

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

MediaRecorder mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // 或 WAV
mediaRecorder.setAudioEncoder(MediaAudioEncoder.AMR_NB); // 或 AAC
mediaRecorder.setOutputFile(tempFile.getAbsolutePath());
mediaRecorder.prepare();
mediaRecorder.start();

音频格式转换(可选)

若服务器要求特定格式(如MP3),需将原始音频转码,可使用 FFmpeg 或第三方库(如 MobileFFmpeg)。

关键代码(FFmpeg示例):

// 转换WAV到MP3
String[] cmd = {"-y", "-i", inputFile.getAbsolutePath(), outputFile.getAbsolutePath()};
FFmpeg.executeAsync(cmd, (executionId, returnCode) -> {
    if (returnCode == RETURN_CODE_SUCCESS) {
        // 转换成功,上传MP3文件
    }
});

上传音频文件

通过HTTP POST请求上传文件到服务器,推荐使用 OkHttpRetrofit

关键代码(OkHttp示例):

OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("file", "voice.mp3", RequestBody.create(file, MediaType.parse("audio/mp3")))
    .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 {
        if (response.isSuccessful()) {
            // 上传成功处理
        }
    }
});

服务器端接收文件

服务器需处理文件上传请求,保存文件到指定路径,以下是常见语言的示例:

语言/框架 关键代码
PHP php $targetDir = 'uploads/'; move_uploaded_file($_FILES['file']['tmp_name'], $targetDir . basename($_FILES['file']['name']));
Java (Spring) java MultipartFile file = request.getFile("file"); file.transferTo(new File(targetDir + file.getOriginalFilename()));
Node.js (Express) javascript const file = req.files.file; file.mv(`uploads/${file.name}`);

注意事项

  1. 文件大小限制:检查服务器允许的最大文件大小,必要时分片上传。
  2. 音频时长控制:可设置最大录制时长(如1分钟),避免占用过多资源。
  3. 安全性:对上传文件进行校验(如文件类型、大小),防止反面文件。

常见问题与解答

问题1:如何检查服务器是否成功接收文件?

解答

  • 服务器端返回HTTP状态码(如200)表示成功。
  • 可通过服务器日志或数据库记录确认文件保存路径。
  • 客户端可在 onResponse 中解析返回数据(如JSON)验证结果。

问题2:如何处理长时间录音(如10分钟以上)?

解答

  • 分段录制:每录制一段(如1分钟)后暂停并保存为独立文件,最后合并上传。
  • 边录边传:使用流式上传(如WebSocket或分块HTTP POST),实时传输音频数据。
  • 优化存储:录制前清理临时文件,避免占用过多存储空间
0