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();
        }
    });
}