2014-12-29 99 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