我对MediaPlayer onCompletion方法有问题。有没有办法在代码运行时改变声音并播放它?我试过这样的东西:
MediaPlayer player;
public void play() {
Database db = new Database(context);
if (player == null) {
player = MediaPlayer.create(context, R.raw.zvuk);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopPlayer();
db.open();
var = db.randomItem();
db.close();
play();
player = MediaPlayer.create(context, R.raw.zvuk2);
play();
}
});
}
player.start();
}
public void stopPlayer() {
if (player != null) {
player.release();
player = null;
}
}
但当我运行这段代码时,第二个声音将不能正常工作--声音相互播放,当我用按钮暂停播放器时,它只会暂停“r.raw.zvuk”,但第二个播放器仍在播放。有人知道这个问题的解决方法吗?
谢谢你的帮助!
这段代码不是100%完整的,因为它的行为是:
但我选择对代码做最小的修改。
private static final String TAG = "MediaPlayerrrrr";
@Nullable
private AssetFileDescriptor mLastAssetFileDescriptor = null;
public void play() {
Database db = new Database(context);
if (player == null) {
player = MediaPlayer.create(context, R.raw.zvuk);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(@NonNull final MediaPlayer mp) {
if (mLastAssetFileDescriptor != null) {
try { mLastAssetFileDescriptor.close(); } catch (IOException ignored) { /*nothing*/ }
mLastAssetFileDescriptor = null;
}
//----------- I don't know what this part do --------
db.open();
var = db.randomItem();
db.close();
//---------------------------------------------------
mLastAssetFileDescriptor = context.getResources().openRawResourceFd(R.raw.zvuk2);
try {
mp.setDataSource(mLastAssetFileDescriptor.getFileDescriptor(), mLastAssetFileDescriptor.getStartOffset(), mLastAssetFileDescriptor.getLength());
mp.start();
} catch (IOException e) {
Log.e(TAG, "Unable to set or play the new song: " + e.getMessage());
}
}
});
}
if (!player.isPlaying()) player.start();
else Log.e(TAG, "MediaPlayer is already playing a song!!");
}