Audio file does not persist in Cordova with LocalFileSystem.PERSISTENT

354 views Asked by At

I have been trying to store Audio file in persistent storage for two days without success.

So far I am able to create an audio file which records audio from Microphone (The app has the permission) using the code attached below.

The audio file is getting generated & stored successfully, I can play it.

But the real problem is when I close the app and come back and try to play the file it shows error.

"{"message": "Cannot use audio file from resource '/myrecording.wav'", "code":1}"

The file is not persistent across app sessions even though I used LocalFileSystem.PERSISTENT.

I am not sure whether the problem is with my Media/Audio code or File storage code.

Please find the code attached below:

Below function records the audio from the microphone.

function _recordAudio() {
        var deferred = $q.defer();
        var src = "myrecording.wav";
        alert("SRC:" + src);
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
            fileSystem.root.getFile(src, {
                create: true,
                exclusive: false
            }, function (fileEntry) {
                alert("File " + src + " created at " + fileEntry.fullPath);
                var mediaRec = new Media(fileEntry.fullPath,
                    function () {
                        alert("Success");
                    }, function (error) {
                        alert("error:" + JSON.stringify(error));
                    });
                // Record audio
                mediaRec.startRecord();

                // Stop recording after 10 sec
                var recTime = 0;
                var recInterval = setInterval(function () {
                    recTime = recTime + 1;
                    if (recTime >= 5) {
                        clearInterval(recInterval);
                        mediaRec.stopRecord();
                        deferred.resolve(fileEntry.fullPath);
                    }
                }, 1000);
            }, function (error) {
                alert("getFile error:" + JSON.stringify(error));
                deferred.reject();
            }); //of getFile
        }, function (error) {
            alert("requestFileSystem error:" + JSON.stringify(error));
            deferred.reject();
        }); //of requestFileSystem
        return deferred.promise;
    }

Below function plays the audio.

    function _play2() {
        var src = "myrecording.wav";
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
            fileSystem.root.getFile(src, null, function (fileEntry) {
                alert("File " + src + " created at " + fileEntry.fullPath);
                var mediaRec = new Media(fileEntry.fullPath,
                    function () {
                        alert("Success play2");
                    }, function (error) {
                     //Getting error after closing and opening the app
                     //Error message = {"message": "Cannot use audio file from resource '/myrecording.wav'","code":1}
                        alert("error play2:" + JSON.stringify(error));
                    });

                mediaRec.play();
                });
        });

    }
1

There are 1 answers

0
Kishan Vaishnav On BEST ANSWER

I solved this problem by passing cdvfile: path to the Media plugin in PlayAudio function code and copying the file from Temp storage to persistent storage. I had to use localURL of the file. This part solved my problem:

fileEntry.file(function (file) {
                            _playNow(file.localURL);
                        }

For full functions refer code snippets below:

recordAudio: function (projectNo, ItemNo) {
                try {
                    var deferred = $q.defer();    

                    var recordingTime = 0;
                    _audioLoader = $("#audioLoader");
                    _audioLoader.show();
                    UtilityService.showPopup('audio');
                    _isRecording = true;

                    _recordFileName = "Audio_" + projectNo + "_" + ItemNo + ".wav";
                    _mediaRecord = new Media(_recordFileName);

                    //Record audio
                    _mediaRecord.startRecord();

                    var recordingInterval = setInterval(function () {
                        recordingTime = recordingTime + 1;

                        $('#audioPosition').text(_secondsToHms(recordingTime));

                        if (!_isRecording) {
                            clearInterval(recordingInterval);
                            _mediaRecord.stopRecord();
                            _mediaRecord.release();

                            deferred.resolve();
                        }
                    }, 1000);

                    //document.getElementById('audioPosition').innerHTML = '0 sec';
                    $('#audioPosition').text('0 sec');
                    return deferred.promise;
                }
                catch (ex) {
                    alert('WMMCPA|recordAudio:- ' + ex.message);
                }
            },

Get file path from the persistent storage and send it to the play method.

            //To play recorded audio for specific project item 
            playAudio: function (projectNo, ItemNo) {
                try {
                    _recordFileName = "Audio_" + projectNo + "_" + ItemNo + ".wav";

                    var newFileUri = cordova.file.dataDirectory + _recordFileName;
                    window.resolveLocalFileSystemURL(newFileUri, function (fileEntry) {
                        fileEntry.file(function (file) {
                            _playNow(file.localURL);
                        }, function (error) {
                            alert("WMMCPA|playAudio.file:-" + JSON.stringify(error));
                        });

                    }, function (error) {
                        alert("WMMCPA|playAudio.resolveLocalFileSystemURL:-" + JSON.stringify(error));
                    });
                }
                catch (ex) {
                    alert("WMMCPA|playAudio:-" + ex.message);
                }
            }
function _playNow(src) {
            try {
                var mediaTimer = null;

                _audioLoader = $("#audioLoader");
                _audioLoader.show();
                UtilityService.showPopup('audio');

                //Create Media object from src
                _mediaRecord = new Media(src);

                //Play audio
                _mediaRecord.play();

                    } catch (ex) {
                        alert('WMMCPA|_playNow.mediaTimer:- ' + ex.message);
                    }
                }, 1000);

            } catch (ex) {
                alert('WMMCPA|_playNow:- ' + ex.message);