我有一个奇怪的问题,我的音频文件有时会播放,有时不播放。问题是,当它决定不玩时,DDMS给了我一个:
E/MediaPlayer﹕ Should have subtitle controller already set
因为这是一对一的音乐没有播放,我已经确定这可能是问题......
如果音乐没有播放,我按下音量按钮就会开始播放。 如果我等待大约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
答案 0 :(得分:11)
查看StackOverflow上的previous discussion以及引入它的引用Android commit,上面的代码可能无法完全初始化MediaPlayer
对象。
媒体播放的KitKat example code表示您应该致电:
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
在构建MediaPlayer
后立即调用setDataSource
方法之前
答案 1 :(得分:1)
我有同样的问题,我通过在实例化MediaPlayer后添加以下内容来修复它。
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (mp == mediaPlayer) {
mediaPlayer.start();
}
}
});
之前我正在实现MediaPlayer.OnPreparedListener并覆盖onPrepared()但它不起作用。
我希望这有帮助!
答案 2 :(得分:-1)
这应该可以解决您的问题(对我而言):在代码的其余部分之后使用异步回调替换“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
答案 3 :(得分:-1)
自从我开始使用此应用程序以来已经很长时间了。以下是我最终要做的工作。 (在KitKat和Lollipop上测试过)。我认为从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();
}
}
答案 4 :(得分:-12)
在清单文件中设置可能会帮助您
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />