MediaPlayer:应该有字幕控制器已经设置:KitKat

我有一个奇怪的问题,我的audio文件有时播放,有时不播放。 问题是,当它决定不玩的时候,DDMS给了我一个:

E/MediaPlayer﹕ Should have subtitle controller already set 

因为这是一对一的音乐不玩,我已经确定,这可能是问题…

如果音乐没有播放,我就按下音量button,开始播放。 如果我等待大约30秒的不玩,它会重新开始(不循环)。

这里发生了什么? 我正在使用KitKat

  player = new MediaPlayer(); AssetFileDescriptor afd = null; try { afd = getAssets().openFd("Theme.mp3"); } catch (IOException e) { e.printStackTrace(); } try { player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); } catch (IOException e) { e.printStackTrace(); } try { player.prepare(); } catch (IOException e) { e.printStackTrace(); } player.setLooping(true); //restart playback end reached //player.setVolume(1, 1); //Set left and right volumes. Range is from 0.0 to 1.0 player.start(); //start play back 

看看以前关于StackOverflow的讨论 ,以及引入了Android的提交 ,上面的代码可能不会完全初始化MediaPlayer对象。

用于媒体播放的KitKat示例代码表明您应该调用:

 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

在构buildMediaPlayer ,在调用setDataSource方法之前立即执行。

我有同样的问题,我通过实例化MediaPlayer后添加以下内容来修复它。

 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { if (mp == mediaPlayer) { mediaPlayer.start(); } } }); 

以前我正在实现MediaPlayer.OnPreparedListener和重写onPrepared(),但它没有工作。

我希望这有帮助!

我从事这个应用程序已经很长时间了。 这是我最终做的工作。 (在KitKat和棒棒糖上testing)。 我认为从MediaPlayer切换到APMediaPlayer是诀窍的一部分。

 @Override public void onDestroy() { if(player != null) { player.release(); player = null; } super.onDestroy(); } @Override public void onStart() { super.onStart(); if(player != null) { player.start(); } else { player = new APMediaPlayer(this); //create new APMediaPlayer player.setMediaFile("Theme.mp3"); //set the file (files are in data folder) player.start(); //start play back player.setLooping(true); //restart playback end reached player.setVolume(1, 1); //Set left and right volumes. Range is from 0.0 to 1.0 } } @Override public void onResume() { super.onResume(); if(player != null) { player.start(); } } 

这应该解决你的问题(对我来说):代替其余的代码,用一个asynchronouscallback代替“player.start()”这一行:

 player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); } }); 

这个错误只是一个Log.e,不是一个真正的错误。 它不应该导致你的玩家不玩,我猜测这是因为玩家没有完成准备,当你尝试调用start()。

 E/MediaPlayer﹕ Should have subtitle controller already set 

在清单文件中设置可能会帮助你

  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />