【问题标题】:MediaPlayer issues - audio file only plays back onceMediaPlayer 问题 - 音频文件只播放一次
【发布时间】:2014-12-30 09:06:15
【问题描述】:

我正在尝试在应用中实现基本的 MediaPlayer,并根据剪辑是否正在播放、播放已完成或手动中断播放(通过按下相同的按钮)来改变按钮的状态。

使用下面的代码,我得到以下结果:

  1. 首次加载时,音频播放正常。

  2. 如果我在播放过程中再次按下 ImageButton,播放将停止。当我再次按下它时,播放会从它停止的时间戳恢复(我认为这是更典型的“pause()”的奇怪行为。

  3. 播放完成后,按钮更改可以正常工作,但是我无法再次播放音频文件。当我按下开始时,它开始播放,然后立即过渡到播放完成,而不实际播放音频。

我一直在搜索其他帖子/google/android 文档,但还没有找到解决方案。

到目前为止我也尝试过:

  1. setLooping(true); - 除了永远无法达到 setOnCompletionListener 之外,这根本没有任何影响。音频根本没有重播。

  2. 1234563它从位置 0 或 100 开始,结果仍然相同(没有听到音频并立即完成)。
  3. 在onCompletion方法中,调用“stop()”、“prepareAsync()”甚至prepare()的几种组合。结果是相同的,但是在随后的播放尝试(即尝试 2、3 等)中,当调用 onCompletion 方法时,我开始收到各种错误,因为在不正确的状态下调用 stop() / prepare() 方法。

        final ImageButton pauseButton = (ImageButton) rootView.findViewById(R.id.playButton1);
        final MediaPlayer mediaPlayer = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.ch01_01);
    
    
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                pauseButton.setImageResource(R.drawable.play_button);
            }
    
        });
    
        pauseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                if(mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                    mediaPlayer.prepareAsync();
                    pauseButton.setImageResource(R.drawable.play_button);
                } else {
                    mediaPlayer.start();
                    pauseButton.setImageResource(R.drawable.stop_button);
                }
            }
        });
    

任何帮助将不胜感激!

附:我将 onCreateView 方法中的所有这些代码用于我的应用程序中的片段。以防万一有人认为这可能是相关的。

【问题讨论】:

  • 我看到两条奇怪的线。停止播放器后的第一个 mediaPlayer.prepareAsync() 。 prepareAsync() 方法触发 onPrepared 侦听器,之后您可以启动播放器。因此,您必须将 prepareAsync 行移至“else”块,将 mediaPlayer.start() 从 else 块移至 onPrepared 方法。将 setOnPrepared 侦听器附加到 mediaPlayer。请查看此图:developer.android.com/images/mediaplayer_state_diagram.gif
  • 您好,感谢您的回复!您注意到的异常只是我正在玩的一些东西,看看我在 stop() 时是否得到相同的行为; vs 当它处于 Completed 状态时。我删除了 stop();和准备异步();并用 pause() 代替。这个暂停功能工作正常,这不是我目前的问题。我只是希望它完成后能够从头开始播放。一旦完成,它就不会再次播放,直到我退出活动并重新进入。当它处于 PlaybackCompleted 时,我应该能够 seekTo(0) 并重新开始,但它不起作用。
  • 所以,我一直在我的三星 Galaxy S2 上运行它(运行 Kitkat 4.4.4 Cyanogenmod)。我尝试在运行 Lollipop 的 Google Nexus 7 (2013) 上运行,它完全符合我的要求。浪费了好几个小时sigh

标签: android-mediaplayer


【解决方案1】:

显然这个问题只是我的三星 Galaxy S2,因为相同的代码在运行 Lollipop 5.0.1 的 Nexus 7 (2013) 上可以正常运行。

Galaxy S2 的问题包括:

  1. 一旦 MediaPlayer 处于 PlaybackCompleted 状态,按下播放时将不会再次播放同一个文件

  2. 尝试在 PlaybackCompleted 状态下运行方法(根据 Android 文档应该是有效的)似乎做了一些事情(即 seekTo(0); 实际上会寻找到 0,但音频文件永远不会播放一秒钟时间。

【讨论】:

  • 不用多想,在开发者选项(Lollipop)中,您可以找到选中的选项“使用 NuPlayer(而不是 Awesome Player)”。我会用模拟设备(不同的 API)做额外的测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多