Cordova Phonegap в приложении теряет функциональность File Api
Я занимаюсь разработкой приложения с использованием Web Audio Api. Я обнаружил, что в том, как Safari обрабатывает аудио, происходит утечка памяти, и он не собирает мусор правильно в контексте аудио. По этой причине я хочу загрузить новую страницу. Попросите эту страницу создать аудио-контекст, завершите операцию, а затем закройте окно, чтобы освободить память.
Я сделал следующее, чтобы достичь этого.
ref = window.open('record.html', '_self');
Откроется страница record.html в Cordova WebView в соответствии с https://wiki.apache.org/cordova/InAppBrowser
1 window.open ('local-url.html'); // загружается в Cordova WebView
2 window.open ('local-url.html', '_self');
// загружается в Cordova WebView
Страница record.html загружает файл javascript, который запускает операции, которые я хочу запустить. Вот файл recordLoad.js, который выполняет некоторые вызовы собственных операций (собственный API доступен только в том случае, если он загружен в Cordova Webview, и, как вы можете видеть, мне нужен доступ к файловой системе, так что это единственный способ увидеть сделай это.
window.onload = createAudioContext;
ref = null;
function createAudioContext(){
console.log('createAudioContext');
window.AudioContext = window.AudioContext || window.webkitAudioContext;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
window.URL = window.URL || window.webkitURL;
audioContext = new AudioContext;
getDirectory();
}
function getDirectory(){
console.log('getDirectory');
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, getFileSystem, fail);
}
function getFileSystem(directory){
console.log('getFileSystem');
var audioPath = localStorage.getItem('audioPath');
directory.root.getFile(audioPath, null, getVocalFile, fail);
}
function getVocalFile(fileEntry){
console.log('getVocalFile');
fileEntry.file(readVocalsToBuffer, fail);
}
function readVocalsToBuffer(file){
console.log('readVocalsToBuffer');
var reader = new FileReader();
reader.onloadend = function(evt){
var x = audioContext.decodeAudioData(evt.target._result, function(buffer){
if(!buffer){
console.log('error decoding file to Audio Buffer');
return;
}
window.voiceBuffer = buffer;
buffer = null;
loadBuffers();
});
}
reader.readAsArrayBuffer(file);
}
//web
function loadBuffers(){
console.log('loadBuffers');
var srcSong = localStorage.getItem('srcSong');
try{
var bufferLoader = new BufferLoader(
audioContext,
[
"."+srcSong
],
createOffLineContext
);
bufferLoader.load()
}
catch(e){
console.log(e.message);
}
}
//
function createOffLineContext(bufferList){
console.log('createOfflineContext');
offline = new webkitOfflineAudioContext(2, window.voiceBuffer.length, 44100);
var vocalSource = offline.createBufferSource();
vocalSource.buffer = window.voiceBuffer;
vocalSource.connect(offline.destination);
var backing = offline.createBufferSource();
backing.buffer = bufferList[0];
backing.connect(offline.destination);
vocalSource.start(0);
backing.start(0);
offline.oncomplete = function(ev){
bufferList = null;
console.log('audioContext');
console.log(audioContext);
audioContext = null;
console.log(audioContext);
vocalSource.stop(0);
backing.stop(0);
vocalSource.disconnect(0);
backing.disconnect(0);
vocalSource = null;
backing = null;
window.voiceBuffer = null;
window.renderedFile = ev.renderedBuffer;
var bufferR = ev.renderedBuffer.getChannelData(0);
var bufferL = ev.renderedBuffer.getChannelData(1);
var interleaved = interleave(bufferL, bufferR);
var dataview = encodeWAV(interleaved);
window.audioBlob = new Blob([dataview], {type: 'Wav'});
saveFile();
}
offline.startRendering();
}
// Этот файл очень длинный, но как только он закончит смешивать два аудио буфера, он записывает новый файл в файловую систему. И когда эта операция завершена, я использую
function gotFileWriter(writer){
console.log('gotFileWriter');
writer.onwriteend = function(evt){
console.log('onwriteEnd');
console.log(window.audioBlob);
delete window.audioBlob;
console.log(window.audioBlob);
// checkDirectory();
var ref = window.open('index.html', '_self');
// ref.addEventListener('exit', windowClose);
}
writer.write(audioBlob);
}
Я возвращаюсь обратно в исходный файл index.html. Это решает проблемы с памятью. Однако, однажды я пытаюсь выполнить ту же операцию во второй раз. т.е. загрузить в файл record.html и запустить файл recordLoad.js Я получаю сообщение об ошибке ReferenceError: Не могу найти переменную: LocalFileSystem
Похоже, что в reload index.html некоторые, но не все ссылки на Cordova API были потеряны. Я все еще могу, например, использовать Media Api, но не File Api. Я понимаю, что это немного хакерский способ (открывать и закрывать окна) для устранения утечки памяти, но я не могу найти другого способа сделать это. Мне действительно нужна помощь с этим. Так что любые указатели очень и очень приветствуются.