我正在开发一个音乐应用程序,如果我要进入可以播放声音的页面,请离开该页面,然后立即重新访问我收到此错误。 我已经搜索了问题,我似乎无法找到类似的东西。 我正在为我的应用程序使用cordova媒体播放器和LowLatencyAudio插件。 下面是指定页面上的代码和我收到的错误的图像。 任何帮助都会非常感激,因为我很好并且真的卡住了!
<div class="drum" id="bass" ontouchstart="play('bass');" ontouchend="touchEnd(event);">Bass</div>
<div class="drum" id="highhat" ontouchstart="play('highhat');" ontouchend="touchEnd(event);">High Hat</div>
<div class="drum" id="snare" ontouchstart="play('snare');" ontouchend="touchEnd(event);">Snare</div>
<div class="drum" id="bongo" ontouchstart="play('bongo');" ontouchend="touchEnd(event);">Bongo</div>
<script type="text/javascript">
var lla;
function onBodyLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
}
function onDeviceReady() {
if( window.plugins && window.plugins.LowLatencyAudio ) {
lla = window.plugins.LowLatencyAudio;
lla.preloadFX('assets/bass.mp3', 'assets/bass.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });
lla.preloadFX('assets/snare.mp3', 'assets/snare.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });
lla.preloadFX('assets/highhat.mp3', 'assets/highhat.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });
lla.preloadFX('assets/bongo.mp3', 'assets/bongo.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });
}
}
function play(drum) {
document.getElementById(drum).className = 'drum touched';
lla.play('assets/' + drum + '.mp3');
}
function touchEnd(event) {
event.target.className = 'drum';
}
</script>
Error: A reference already exists for the audio id.
答案 0 :(得分:0)
看起来问题是lla.preloadFX
多次为同一资产调用。在阅读了插件文档和实际的java代码之后,这个错误实际上是一个警告/通知而不是错误。我重新格式化了我的示例,以显示我将如何忽略此消息,因为它不会影响您的应用程序。
以下是一个例子:
function onDeviceReady() {
if( window.plugins && window.plugins.LowLatencyAudio) {
lla = window.plugins.LowLatencyAudio;
lla.preloadFX('assets/bass.mp3', 'assets/bass.mp3', function(msg){}, function(msg){ if(msg != 'A reference already exists for the specified audio id.') { alert( 'Error: ' + msg ); } });
}
}
使用此代码,如果出现“真实”错误,您将看到错误,否则它将忽略有关已加载资源的消息。这应该可以解决问题。
答案 1 :(得分:0)
实际上是deviceready事件调用函数lla.preloadFX
,preloadFx()
尝试再次加载已加载的资产。因此,您只需处理后退按钮事件即可在应用程序退出时卸载资产。
function onBodyLoad() {
document.addEventListener("backbutton", onBackButton, false);
}
function onBackButton() {
var assets=['bass','snare','highhat','bongo'];
for (x in assets) {
lla.unload(assets[x], function (msg) {}, function (msg) {});
}
navigator.app.exitApp();
}