音频文件未上传到 Firebase 存储

Audio File is not Uploading to 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 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;
        }
    }
}

一切正常,但当我上传录制的音频文件时,它没有上传。 我发现错误出在这些行中:

filePath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                progressDialog.dismiss();
            }
        });

但我无法找到错误原因以及无法将音频文件完美上传到 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();
    }
})

但据我所知,您正在尝试上传文件夹而不是文件。这是您需要做的。 声明成员

var recordingPath: Uri = null

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