android - Firebase 存储,无法播放录制的音频消息。在新条目上覆盖旧注册。怎么解决?
问题描述
我正在尝试实现一个可以发送语音消息的聊天系统。这是我的逻辑:维护一个按钮并传递它的消息。然后,松开按钮,消息将保存在 Firestore 存储中。我录制得很好,但遇到了两个障碍:在新条目上,以前的条目被覆盖,我宁愿在我的 firenase 存储中拥有完整的语音消息列表。另外录音后,我无法打开声音。有人能救我吗?
这是我的代码: Oncreate Methode
fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
fileName += "/recored_audio.3gp" ;
btnrecoder.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startRecording();
btnrecoder.setText(" Recording start...");
} else if (event.getAction() == MotionEvent.ACTION_UP) {
stopRecording();
}
return true;
}
});
Out of the onCreate :
private void startRecording() {
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile(fileName);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
recorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed" + e.getMessage());
}
recorder.start();
}
private void stopRecording() {
recorder = new MediaRecorder();
recorder.release();
try{
recorder.stop();
}catch(RuntimeException stopException){
//handle cleanup here
Log.d(TAG," message derreure " + stopException.getMessage());
}
recorder = null;
uploadAudio();
}
private void uploadAudio(){
StorageReference fii = storageReference.child("Audio").child("new audio.3gp");
Uri uri = Uri.fromFile(new File(fileName));
fii.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
btnrecoder.setText("Uploading finished");
Toast.makeText(FriendList.this, "Vocal Save to db storage", Toast.LENGTH_SHORT).show();
}
});
}
有类似的问题没有得到具体的答案
解决方案
正如我在这里提出的,无法在从 android 应用发送的 Firebase 存储中播放音频,
您的问题可能是由MediaRecorder引起的。我发现输出格式应该设置为AAC。然后浏览器就可以播放了。我在尝试使用 React JS 在 Android 中播放 MediaRecorder 捕获的音频时遇到了这个问题,我尝试了各种格式(.3gp、.mp4、.wav),但这是唯一有效的一种。我怀疑还有其他的。
所以:
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
推荐阅读
- confluence - 为宏提供动态配置(属性)
- php - Origin http://localhost:xxxx is not allowed by Access-Control-Allow-Origin
- amazon-web-services - 任务定义创建失败
- acumatica - 从 REST API 创建采购收据
- javascript - 如何在子组件中使用 useState
- node.js - 使用 tsyringe 将依赖项注入控制器时出错
- tkinter - 如何在 Tkinter Tksheets 中应用过滤器
- java - 使用扫描仪后可以使用 bufferedreader 吗?
- stripe-payments - 是否可以仅使用后端的 Stripe?
- amazon-web-services - 通过 Lambda 将带有 boto 的 .tar.bz2 文件上传到 s3 会产生 11 字节文件