ioscordovalocal-storagephonegapcordova-media-plugin

Audio file does not persist in Cordova with LocalFileSystem.PERSISTENT


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

    }

Solution

  • 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);