我的问题是当我点击一个切换按钮,正在播放mp3播放器时,当我点击它时它正在停止。因此,当我第一次尝试运行时,它可以工作。但是当我第二次点击它时会发出IllegalStateException和“E / MediaPlayer(1009):在状态32中调用attachNewPlayer”错误。我该如何解决这个问题?谢谢。
我的代码在这里:
公共类MyButtons扩展了Activity {
private static final int[] idBtns = { R.id.btn1, R.id.btn2, R.id.btn3,
R.id.btn4, R.id.btn5, R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9 };
String[] mpUrls = new String[idBtns.length];
ToggleButton[] mbuttons = new ToggleButton[idBtns.length];
MediaPlayer mp3player = new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mybuttons);
mp3player.setAudioStreamType(AudioManager.STREAM_MUSIC);
for (int i = 0; i < idBtns.length; i++) {
final int k = i;
mbuttons[k] = (ToggleButton) findViewById(idBtns[k]);
mpUrls[k] = "http://www.testsite.com/def-music-"+ (k + 1) + ".mp3";
}
for (int i = 0; i < idBtns.length; i++) {
final int k = i;
mbuttons[k].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
boolean on = ((ToggleButton) view).isChecked();
if (on) {
try {
mp3player.setDataSource(mpUrls[k]);
mp3player.prepare();
mp3player.start();
mp3player.setLooping(true);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
Toast.makeText(getApplicationContext(), e.toString(),Toast.LENGTH_LONG).show();
}
} else {
if (mp3player.isPlaying()) {
mp3player.pause();
mp3player.seekTo(0);
}
}// if(on)-else statement's end
}// onClick's end
});
}// for loop's end
}
}
答案 0 :(得分:0)
必须在空闲状态下调用setDataSource。如果您第二次单击切换按钮,则其状态不得为空闲状态。所以你应该使用媒体播放器监听器管理你的应用程序中的状态,你应该让它相应地工作。或者,您可以在每次开始播放时重置mediaplyer。但它可以提供糟糕的用户环境。 您可以参考有关有效和无效状态的文档。 https://developer.android.com/reference/android/media/MediaPlayer.html