Android phonegap音频应用程序返回java.io.IOException:准备失败:状态=0x1错误
我的音乐应用程序返回java.io.IOException:Prepare failed.:播放第8首mp3曲目或播放同一曲目8次后,状态=0x1错误。 我正在使用标准的phonegap媒体API来运行音频,下面是代码:Android phonegap音频应用程序返回java.io.IOException:准备失败:状态=0x1错误,android,cordova,Android,Cordova,我的音乐应用程序返回java.io.IOException:Prepare failed.:播放第8首mp3曲目或播放同一曲目8次后,状态=0x1错误。 我正在使用标准的phonegap媒体API来运行音频,下面是代码: <!-- language: lang-js --> // The Audio player var my_media = null; var mediaTimer = null; // duration of media (song) var dur = -1
<!-- 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();
});
});
//音频播放器
var my_media=null;
var mediaTimer=null;
//媒体持续时间(歌曲)
var-dur=-1;
//需要知道何时暂停或不暂停
var为_=假;
//在第页上设置音频位置
功能设置音频位置(位置){
$(“音频位置”).html(位置+“秒”);
}
//onSuccess回调
函数onSuccess(){
设置音频位置(dur);
clearInterval(mediaTimer);
mediaTimer=null;
my_media=null;
is_=false;
dur=-1;
}
//错误回调
函数onError(错误){
警报('code:'+error.code+'\n'+
'消息:'+error.message+'\n');
clearInterval(mediaTimer);
mediaTimer=null;
my_media=null;
is_=false;
设置音频位置(“0”);
}
功能播放音频(src){
如果(我的媒体===null){
//用户界面细节
$(“#media_dur”).html(“0”);
$(“#音频位置”).html(“加载…”);
//从src创建媒体对象
my_media=新媒体(src、onSuccess、onError);
//播放音频
//警报(“播放音频”);
我的媒体播放();
}否则{
如果(是否已暂停){
//恢复歌曲中暂停的位置:call.play()
is_=false;
我的媒体播放();
}
}
//每秒更新我的媒体位置
如果(mediaTimer==null){
mediaTimer=setInterval(函数(){
my_media.getCurrentPosition(
//成功回调
职能(职位){
如果(位置>-1){
设置音频位置(数学圆(位置));
//getDuration()可能需要几秒钟,请继续尝试
//这是一个更好的方法,没有回调
如果(dur 0){
dur=数学圆(dur);
$(“#media_dur”).html(dur);
}
}
}
},
//错误回调
职能(e){
警报(“获取位置时出错=”+e);
设置音频位置(“错误:+e”);
}
);
}, 1000);
}
}
//暂停音频
函数pauseAudio(){
如果(暂停)返回;
如果(我的媒体){
是否暂停=真;
我的媒体暂停();
}
}
//停止音频
函数stopAudio(){
如果(我的媒体){
//成功的.stop()将调用.release()
我的媒体。停止();
my_media=null;
}
中频(媒体定时器){
clearInterval(mediaTimer);
mediaTimer=null;
}
is_=false;
dur=0;
}
$('#page basics').live('pageinit',function(){
$(“.pl”).live('tap',function(){
var ind=$(“.pl”).指数(本);
var src=“/android_asset/”+ind+“.mp3”;
播放音频(src);
});
$(“#pauseaudio”).live('tap',function(){
pauseAudio();
});
$(“#stopaudio”).live('tap',function(){
停止音频();
});
});
Android上的OpenCore实例即将用完。您需要调用my_media.release()来释放OpenCore的一个实例,以便Android可以创建一个新的MediaPlayer。我在你的评论中看到你说停止通话释放,但事实并非如此。您可能希望停止播放音频并重新启动,而无需重新创建音频播放器
因此,您需要做的是,一旦您不再需要音频,您应该呼叫:
my_media.release();
我已尝试使用$(“.pl”).live('tap',function(){if(my_media!=null){my_media.release()}仍然不起作用。我将尝试使用你的方法,希望它能起作用!我已根据你的建议编辑了代码,不再出现“准备失败”错误。我正在处理另一个问题-当播放另一首曲目时启动mp3,会导致停止所有媒体(因为media.release()函数被调用)。但是,我需要应用程序停止播放当前曲目,并继续播放下一首曲目,而用户无需点击两次。希望您能提供建议。以下是我当前使用的代码:
$(“#页面基础”).live('pageinit',function(){
$('a.pl')。live('tap',function(){updateMedia()
var cl=$(this.attr('id');
var source=“/android_asset/”+cl+”.mp3”
myMedia=new Media(source,stopAudio,null);
playAudio();
];
@ElenaBoldyreva您可能想看看适用于Android的LowLatencyAudio插件,因为它可能只提供您需要的所有功能。