2014-12-29 98 views
0

我想实现一个应用程序基本的MediaPlayer,并具有根据剪辑是否正在播放按钮改变状态,播放完毕,或播放手动中断(由按下相同的按钮)。MediaPlayer的问题 - 音频文件只播放一次

与下面的代码,我得到如下结果:

  1. 第一次加载时,音频播放罚款。

  2. 如果我按下的ImageButton回放期间的第二时间,再现停止。当我再次按下它时,播放会从停止的时间戳恢复(我认为这是一个更奇怪的行为,更典型的是“暂停()”。)

  3. 一旦播放完成,按钮更改完美工作,但我无法重放音频文件的第二次。当我按下开始,它开始播放,然后立即转移到playbackcompleted,实际上并没有播放音频。

我已经通过其他职位淘/谷歌/ Android文档,但还没有找到一个解决方案尚未。

我也有尝试到目前为止:

  1. setLooping(true); - 除了setOnCompletionListener之外,这完全没有效果。音频根本不播放。

  2. 在onCompletion方法中,将seekTo()设置为几个不同的值(0,100),并使用包括“getCurrentPosition()”的日志消息来确认它实际上正在执行此操作,但即使这确认它是从位置0开始,或100,结果还是一样的(听不见声音和完成立即发生)。

  3. 在onCompletion方法,几个调用的组合 “的stop()”, “prepareAsync()” 或甚至准备()。结果是相同的,然而在随后的尝试(即尝试2,3等)来播放,当被称为onCompletion方法,我开始各种错误调用停止()/准备()以不正确的状态的方法。

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

任何帮助,将不胜感激!

P.S.我在我的应用程序中使用onCreateView方法中的所有代码片段。以防万一任何人认为这可能是相关的。

+0

我看到两条奇怪的线。在停止播放器之后首先使用mediaPlayer.prepareAsync()。 prepareAsync()方法触发onPrepared侦听器,然后您可以启动播放器。所以你必须将prepareAsync行移到“else”块,从else块中移除mediaPlayer.start()到onPrepared方法。将setOnPrepared侦听器附加到mediaPlayer。请检查此图:http://developer.android.com/images/mediaplayer_state_diagram.gif – bajicdusko

+0

嗨,谢谢你的回应!你注意到的异常只是我正在玩的一些东西,看看我停止()时是否得到相同的行为。 vs当它处于Completed状态时。 我删除了stop();和prepareAsync();并用一个暂停()代替。此暂停功能正常工作,这不是我目前的问题。我只希望它能够在完成后从头开始再玩。 一旦它完成,它不会再次播放,直到我退出活动并返回。 当它在PlaybackCompleted中时,我应该能够seekTo(0)并再次启动,但它不起作用。 –

+0

所以,我一直在我的三星Galaxy S2上运行(运行Kitkat 4.4.4 Cyanogenmod)。 我试着在我的谷歌Nexus 7(2013)运行棒棒糖,它的工作原理是我想要的。有好几个小时浪费了*叹息* –

回答

0

显然这个问题只是我的三星Galaxy S2,因为相同的代码完美地运行在我的Nexus 7(2013)运行Lollipop 5.0.1上的预期。

在Galaxy S2的问题包括以下内容:

  1. 一旦MediaPlayer的是在PlaybackCompleted状态,也不会起到同样的文件时,播放按下

  2. 试图第二次在PlaybackCompleted状态下运行Methods(根据Android文档应该是有效的)似乎会做某些事情(即seekTo(0);实际上会寻求0,但音频文件将永远不会再播放。

+0

不用多加思考,在Developer options(Lollipop)中,你可以找到选项“Use NuPlayer(而不是Awesome Player)”。我会用仿真设备(不同的API)进行额外的测试 – bajicdusko