Android 音频文件未上载到Firebase存储
代码如下:Android 音频文件未上载到Firebase存储,android,firebase,audio,firebase-storage,Android,Firebase,Audio,Firebase Storage,代码如下: public class AddFragment extends Fragment { private Button btn_taptorecord; Boolean isRecording = false; private String recordPermission = Manifest.permission.RECORD_AUDIO; private String recordFile; ProgressDialog progres
public class AddFragment extends Fragment {
private Button btn_taptorecord;
Boolean isRecording = false;
private String recordPermission = Manifest.permission.RECORD_AUDIO;
private String recordFile;
ProgressDialog progressDialog;
private MediaRecorder mediaRecorder;
StorageReference audioReference;
private int PERMISSION_CODE = 7;
public AddFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_add, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
btn_taptorecord = view.findViewById(R.id.btn_taptorecord);
audioReference = FirebaseStorage.getInstance().getReference();
progressDialog = new ProgressDialog(getContext());
btn_taptorecord.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
//stop recording
stopRecording();
isRecording = false;
}
else {
//start recording
startRecording();
if (checkPermissions()) {
isRecording = true;
}
}
}
});
}
private void stopRecording() {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
uploadAudio();
}
private void uploadAudio() {
progressDialog.setMessage("Uploading...");
progressDialog.show();
String recordPath = getActivity().getExternalFilesDir("/").getAbsolutePath();
Uri uri = Uri.fromFile(new File(recordPath));
StorageReference filePath = audioReference.child("Audio").child(uri.getLastPathSegment());
filePath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
}
});
}
private void startRecording() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss", Locale.TAIWAN);
String recordPath = getActivity().getExternalFilesDir("/").getAbsolutePath();
Date date = new Date();
recordFile = "Heart Leaf" + formatter.format(date) + ".3gp";
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setOutputFile(recordPath + "/" + recordFile);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaRecorder.start();
}
private boolean checkPermissions() {
if (ActivityCompat.checkSelfPermission(getContext(), recordPermission) == PackageManager.PERMISSION_GRANTED) {
return true;
}
else {
ActivityCompat.requestPermissions(getActivity(), new String[]{recordPermission}, PERMISSION_CODE);
return false;
}
}
}
public类AddFragment扩展了Fragment{
专用按钮btn_TaptoreRecord;
布尔值isRecording=false;
私有字符串recordPermission=Manifest.permission.RECORD\u音频;
私有字符串记录文件;
进行对话进行对话;
专用媒体记录器;
存储参考音频参考;
私有int权限_代码=7;
公共AddFragment(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
返回充气机。充气(R.layout.fragment_add,container,false);
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
btn_taptorecord=view.findviewbyd(R.id.btn_taptorecord);
audioReference=FirebaseStorage.getInstance().getReference();
progressDialog=新建progressDialog(getContext());
btn_taptorecord.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(isRecording){
//停止录音
停止录制();
isRecording=false;
}
否则{
//开始录音
startRecording();
if(checkPermissions()){
isRecording=true;
}
}
}
});
}
私有void stopRecording(){
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder=null;
上传音频();
}
私有void uploadAudio(){
progressDialog.setMessage(“上载…”);
progressDialog.show();
String recordPath=getActivity().getExternalFilesDir(“/”).getAbsolutePath();
Uri=Uri.fromFile(新文件(记录路径));
StorageReference文件路径=audioReference.child(“音频”).child(uri.getLastPathSegment());
filePath.putFile(uri).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
progressDialog.disclose();
}
});
}
私有无效开始记录(){
SimpleDataFormat格式化程序=新的SimpleDataFormat(“yyyy\u-MM\u-dd\u-hh\u-MM\u-ss”,Locale.TAIWAN);
String recordPath=getActivity().getExternalFilesDir(“/”).getAbsolutePath();
日期=新日期();
recordFile=“Heart Leaf”+格式化程序.format(日期)+“.3gp”;
mediaRecorder=新的mediaRecorder();
mediaRecorder.setAudioSource(mediaRecorder.AudioSource.MIC);
setOutputFormat(mediaRecorder.OutputFormat.ThreeGPP);
mediaRecorder.setOutputFile(记录路径+“/”+记录文件);
mediaRecorder.setAudioEncoder(mediaRecorder.AudioEncoder.AMR_NB);
试一试{
mediaRecorder.prepare();
}捕获(IOE异常){
e、 printStackTrace();
}
mediaRecorder.start();
}
私有布尔检查权限(){
if(ActivityCompat.checkSelfPermission(getContext(),recordPermission)==PackageManager.PERMISSION\u已授予){
返回true;
}
否则{
requestPermissions(getActivity(),新字符串[]{recordPermission},权限\代码);
返回false;
}
}
}
一切都很好,但当我上传录制的音频文件时,它没有上传。
我发现故障在以下几行:
filePath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
}
});
filePath.putFile(uri).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
progressDialog.disclose();
}
});
但我无法找到错误所在以及无法将音频文件完美上传到Firebase数据库的原因。您可以使用
filePath.putFile(uri)
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// print your exception here
}
})
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
}
})
在函数startRecording()的末尾添加这一行,以将URL保存到文件中
private void startRecording() {
...
recordingPath = Uri.fromFile(new File(recordPath + "/" + recordFile));
}
所以你可以在上传时使用它
private void uploadAudio() {
progressDialog.setMessage("Uploading...");
progressDialog.show();
Uri uri = recordingPath
StorageReference filePath = audioReference.child("Audio").child(uri.getLastPathSegment());
filePath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
}
});
}
private void uploadAudio(){
progressDialog.setMessage(“上载…”);
progressDialog.show();
Uri=recordingPath
StorageReference文件路径=audioReference.child(“音频”).child(uri.getLastPathSegment());
filePath.putFile(uri).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
progressDialog.disclose();
}
});
}
首先感谢您的回复,但它仍然不起作用,我的存储规则是:rules_version='2';service firebase.storage{match/b/{bucket}/o{match/{allpath=**}{allow read,write:if true;}}}}}你能告诉我另一种方法吗!要修复它,我就修复它。规则_version='2';service firebase.storage{match/b/{bucket}/o{match/{allpath=**}{allow read,write:if true;}}}}}当您从.addOnfailureListener打印异常消息时,您得到了什么?它在filePath.putFile(uri)中显示错误当我停止录制时,它会停止,但“进度”对话框会持续运行,这意味着文件无法成功上载到firebase存储。这段代码中到底有什么内容不能按预期的方式工作?告诉我们共享代码有什么问题。你有什么错误吗?
private void uploadAudio() {
progressDialog.setMessage("Uploading...");
progressDialog.show();
Uri uri = recordingPath
StorageReference filePath = audioReference.child("Audio").child(uri.getLastPathSegment());
filePath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
}
});
}