2012-02-06 55 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

相關問題