提问者:小点点

MediaPlayer-onCompletion问题


我对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”,但第二个播放器仍在播放。有人知道这个问题的解决方法吗?

谢谢你的帮助!


共1个答案

匿名用户

这段代码不是100%完整的,因为它的行为是:

  1. 您调用play()
  2. r.raw.zvuk正在播放
  3. 当r.raw.zvuk完成时,将播放r.raw.zvuk2
  4. 当r.raw.zvuk2完成时,r.raw.zvuk2将一次又一次地播放,直到永远...
  5. 无法在此代码中停止此循环

但我选择对代码做最小的修改。

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!!");
}