上一篇
安卓发送语音到服务器
- 行业动态
- 2025-04-22
- 5
权限申请
安卓系统需要动态申请敏感权限(录音、存储、网络),确保应用有权限访问麦克风和网络。
关键代码:
// 检查并请求权限 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格式)。
关键代码:
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请求上传文件到服务器,推荐使用 OkHttp
或 Retrofit
。
关键代码(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分钟),避免占用过多资源。
- 安全性:对上传文件进行校验(如文件类型、大小),防止反面文件。
常见问题与解答
问题1:如何检查服务器是否成功接收文件?
解答:
- 服务器端返回HTTP状态码(如200)表示成功。
- 可通过服务器日志或数据库记录确认文件保存路径。
- 客户端可在
onResponse
中解析返回数据(如JSON)验证结果。
问题2:如何处理长时间录音(如10分钟以上)?
解答:
- 分段录制:每录制一段(如1分钟)后暂停并保存为独立文件,最后合并上传。
- 边录边传:使用流式上传(如WebSocket或分块HTTP POST),实时传输音频数据。
- 优化存储:录制前清理临时文件,避免占用过多存储空间