2012-02-06 60 views
0

我的音乐应用程序返回java.io.IOException:准备失败:状态= 0x1在第8首mp3音轨播放后或同一曲目播放8次。 我使用了一个标准的PhoneGap媒体API运行声音,下面的代码:Android手机音频应用程序返回java.io.IOException:准备失败:状态= 0x1错误

<!-- language: lang-js --> 
// The Audio player 
var my_media = null; 
var mediaTimer = null; 
// duration of media (song) 
var dur = -1; 
// need to know when paused or not 
var is_paused = false; 

//Set audio position on page 
function setAudioPosition(position) { 
    $("#audio_position").html(position + " sec"); 
} 

//onSuccess Callback 
function onSuccess() { 
setAudioPosition(dur); 
clearInterval(mediaTimer); 
mediaTimer = null; 
my_media = null; 
is_paused = false; 
dur = -1; 
} 

//onError Callback 
function onError(error) { 
    alert('code: ' + error.code + '\n' + 
     'message: ' + error.message + '\n'); 
clearInterval(mediaTimer); 
mediaTimer = null; 
my_media = null; 
is_paused = false; 
setAudioPosition("0"); 
} 

function playAudio(src) { 

    if (my_media === null) { 
    // ui niceties 
    $("#media_dur").html("0"); 
    $("#audio_position").html("Loading..."); 

    // Create Media object from src 
    my_media = new Media(src, onSuccess, onError);  
    // Play audio 
    //alert('Playing Audio'); 
    my_media.play(); 
    } else { 
    if (is_paused) { 
     // to resume where paused in song: call .play() 
     is_paused = false; 
     my_media.play(); 
    } 
    } 

// Update my_media position every second 
if (mediaTimer === null) { 
    mediaTimer = setInterval(function() { 
     my_media.getCurrentPosition(
       // success callback 
       function(position) { 
        if (position > -1) { 
         setAudioPosition(Math.round(position)); 
         // getDuration() can take a few seconds so keep trying 
         // this could be done a better way, no callback for it 
         if (dur <= 0) { 
          dur = my_media.getDuration();        
          if (dur > 0) { 
           dur = Math.round(dur); 
           $("#media_dur").html(dur); 
          } 
         }              
        } 
       }, 
       // error callback 
       function(e) { 
        alert("Error getting pos=" + e); 
        setAudioPosition("Error: " + e); 
       } 
     ); 
    }, 1000); 
} 
} 

//Pause audio 
function pauseAudio() { 
if (is_paused) return; 
if (my_media) { 
    is_paused = true; 
    my_media.pause(); 
} 
} 

//Stop audio 
function stopAudio() { 
if (my_media) { 
    // A successful .stop() will call .release() 
    my_media.stop(); 
    my_media = null; 
} 
if (mediaTimer) { 
    clearInterval(mediaTimer); 
    mediaTimer = null; 
} 
is_paused = false; 
dur = 0; 
} 


$('#page-basics').live('pageinit',function(){ 


$(".pl").live('tap', function() { 

var ind = $(".pl").index(this); 

    var src = "/android_asset/" + ind + ".mp3"; 

    playAudio(src); 


}); 


$("#pauseaudio").live('tap', function() { 
    pauseAudio(); 
}); 

$("#stopaudio").live('tap', function() { 
    stopAudio(); 
}); 
}); 

回答

1

您正在运行在Android上进行的OpenCore实例。您需要调用my_media.release()来释放OpenCore的一个实例,以便Android可以创建一个新的MediaPlayer。我在你的评论中看到你说停止呼叫释放,但事实并非如此。您可能需要停止播放音频并重新启动,而无需重新创建AudioPlayer。

所以,你需要做的是,一旦你不再需要的音频了,你应该叫:(“PL”)。

my_media.release(); 
+0

我使用\t $试图生活(‘水龙头’,功能(){ \t如果(my_media!= NULL){ \t \t \t my_media.release(); \t \t}还不行 – 2012-02-06 20:21:06

+0

将在http://simonmacdonald.blogspot.com/尝试用你的方法2011/05/using-media-class-in-phonegap.html希望它能起作用! – 2012-02-06 20:34:54

+1

我已根据您的建议编辑了代码,并且“准备失败”错误不再出现。我现在正在处理另一个问题 - 当一个mp3在另一个轨道正在播放时开始,它会导致停止所有媒体(因为media.release()函数被调用)。不过,我需要该应用停止播放当前曲目,然后继续播放下一首曲目,无需用户点击两次。希望你能建议。这里是我目前使用的代码: – 2012-02-08 12:27:49

相关问题