MediaPlayer
SDカードにすべての曲が入ったオブジェクトとスピナーがあります。再生、一時停止、停止、前へ、次への各ボタンのコードを作成しようとしています。
スピナーの項目が選択されているとき、そこから MediaPlayer を取得し、そのデータ ソースを設定して準備メソッドを呼び出します。コードは次のとおりです。
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Context context = getApplicationContext();
CharSequence text = "onItemSelected";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(sdcard_playlist.get(arg2));
applyValuesToEqualizer();
mediaPlayer.prepare();
index = arg2;
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
各停止ボタンと次へボタンのコードは次のとおりです。
public void stopSong(View view) {
if (isPlaying) {
mediaPlayer.reset();
isPlaying = false;
spinner.setSelection(index, false); // index is the index of the chosen item from spinner
seekbar.setProgress(0);
}
}
public void nextSong(View view) {
if (isPlaying) {
mediaPlayer.reset();
isPlaying = false;
spinner.setSelection(index + 1, false);
seekbar.setProgress(0);
playPauseSong(findViewById(R.id.pause_music_button));
} else {
spinner.setSelection(index + 1, false);
seekbar.setProgress(0);
}
}
何が起こっているかというと、nextSong() が呼び出されると、すべてが正常に機能し、onItemSelected() のトーストが表示されますが、stopSong() が呼び出されると、onItemSelected() が実行されず、トーストが表示されず、曲停止中ですが、再生ボタンをもう一度クリックすると、例外が発生します: 状態 1 で呼び出された開始、エラー (-38, 0)。これは、mediaPlayer がリセットされ、再度準備されていないためです。
前もって感謝します :)