当前位置: 首页 > 知识库问答 >
问题:

MediaPlayer-onCompletion问题

冉丰茂
2023-03-14

我对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个答案

陈志
2023-03-14

这段代码不是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!!");
}
 类似资料:
  • 我正在尝试设置一个具有声音的媒体播放器,可以根据需要多次播放和重播。但我在第一次播放音频时出现了以下错误: 我调用该剧的代码是: playSong()函数是: 我的声音位于res/raw/a.mp3中 当我按下BTN播放按钮时,我会显示BTN停止按钮,但没有播放任何内容。 我希望让用户玩、停、玩等等。我怎样才能做到这一点? LogCat:

  • 问题是:我的Firebase从一个正常工作的文档获取信息(log.d和Toast显示它正确获取信息) 但是,在创建GameMenu activity时,包(savedInstanceState)为空,并且尝试获取该信息会给我带来异常。 非常感谢快速的帮助,我们在这里有点慌乱:(

  • 我一直在win10上使用MediaPlayer,它工作得非常好,但是在我的MacBook Air(10.13.4 (17E202)上根本没有声音输出。我已经发现了类似的问题,并观察到它是由气相色谱引起的。 基于这样的答案我竭尽全力避免这件事 我试着让媒体播放器成为最终的、静态的、私有的、公共的,与getter和setter一起工作,外包,作为一个类变量,作为一个本地变量,但没有任何效果。 我正在运

  • 我正在写一个程序,需要从存储器中播放一首歌曲。我为此设置了一个MediaPlayer(下面的代码片段),但一直使用java。io。IOException:准备失败:状态=0x1。一些网站指出,发生此错误的原因可能是我试图读取的文件不具有世界可读性。如果这是真的,我如何从程序中更改文件权限、绕过此问题或其他解决方案。如果没有,请帮我找出这有什么问题。提前谢谢。

  • 问题内容: 我尝试做简单的在线广播播放器。这是流的地址http://radio-electron.ru:8000/96这是我的代码。 MyActivity.java main.xml 我不知道为什么我得到-(38,0)代码,这是什么意思。我使用Intellij IDEA,并在Android 2.3和4.2模拟器上尝试此代码,但遇到了一些问题。 问题答案: -38引用errno.h中的错误代码 您似

  • 我有两个活动,家庭作业和更密切。我在家庭作业中播放了一首歌,但当按下一个按钮时,媒体播放器会暂停,并打开closer。在我的onPause函数中,我试图暂停媒体播放器,但它不起作用,activity越接近打开,音乐还在播放。之前,我将它设置为在activity家庭作业的按钮监听器中,媒体播放器暂停,但当我将它设置为onResume时,mediaplayer不会恢复。我想这可能是mediaplaye