2016-03-28 312 views
0

我在我的應用程序中製作音頻播放器。它正在使用一個視圖列表,所有工作都很完美。我可以開始暫停,下一個音樂流。我正在加載一個網址來播放音樂。當我關閉應用時,音樂停止播放。我需要繼續玩。我已經閱讀了關於音頻焦點的內容。但我不完全相信如何將它添加到代碼中。我有我的清單wake_lock。當應用程序關閉時,Android Studio音頻停止播放

我對android很新穎,所以它是線索和錯誤,但是這個我只是無法弄清楚。另外,當我關閉應用程序並在音樂播放時再次啓動並啓動它時,應用程序崩潰。

public void controlMusicPlayer(String musicUrl) { 

     final String playUrl = musicUrl; 


     Log.d("Song url received:", playUrl); 
     if (!mediaPlayer.isPlaying()) { 
        playercontrol.setVisibility(View.VISIBLE); 
        btn.setBackgroundResource(R.drawable.pause); 

        new Player() 
        .execute(playUrl); 
      playPause = true; 

      Log.d("Play State:", "Starting song"); 

     } else { 

      Log.d("Play State:", "Next song is being started"); 

      playPause = true; 

      mediaPlayer.reset(); 

      btn.setBackgroundResource(R.drawable.pause); 
      if (mediaPlayer.isPlaying()) 
       mediaPlayer.pause(); 
      playPause = false; 

      new Player() 
      .execute(playUrl); 


     } 

      } 

     public View.OnClickListener pausePlay = new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 


       if (!playPause) { 

        btn.setBackgroundResource(R.drawable.pause); 
        if (intialStage) 
         new Player() 
           .execute(Urlmusic); 
        else { 
         if (!mediaPlayer.isPlaying()) 
          mediaPlayer.start(); 
        } 
        playPause = true; 
       } else { 
        btn.setBackgroundResource(R.drawable.play); 
        if (mediaPlayer.isPlaying()) 
         mediaPlayer.pause(); 
        playPause = false; 
       } 
      } 
     }; 


    /** 
    * preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread. 
    * @author piyush 
    * 
    */ 

    class Player extends AsyncTask<String, Void, Boolean> { 
     private ProgressDialog progress; 

     @Override 
     protected Boolean doInBackground(String... params) { 
      // TODO Auto-generated method stub 
      Boolean prepared; 
      try { 

       mediaPlayer.setDataSource(params[0]); 

       mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 

        @Override 
        public void onCompletion(MediaPlayer mp) { 
         // TODO Auto-generated method stub 
         intialStage = true; 
         playPause=false; 
         btn.setBackgroundResource(R.drawable.play); 
         mediaPlayer.stop(); 
         mediaPlayer.reset(); 
        } 
       }); 
       mediaPlayer.prepare(); 
       prepared = true; 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       Log.d("IllegarArgument", e.getMessage()); 
       prepared = false; 
       e.printStackTrace(); 
      } catch (SecurityException e) { 
       // TODO Auto-generated catch block 
       prepared = false; 
       e.printStackTrace(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       prepared = false; 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       prepared = false; 
       e.printStackTrace(); 
      } 
      return prepared; 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      if (progress.isShowing()) { 
       progress.cancel(); 
      } 
      Log.d("Prepared", "//" + result); 
      mediaPlayer.start(); 

      intialStage = false; 
     } 

     public Player() { 
      progress = new ProgressDialog(MainActivity.this); 
     } 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      this.progress.setMessage("Buffering..."); 
      this.progress.show(); 

     } 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     if (mediaPlayer != null) { 
      mediaPlayer.reset(); 
      mediaPlayer.release(); 
      mediaPlayer = null; 
     } 
    } 

    ////////////////////////////////// end music play list ///////////////////////////////////////// 

感謝您的幫助。

+0

您應該使用服務播放音頻,而不是僅在活動中播放 –

回答

1

看起來控制暫停播放或下等。此方法總是在關閉應用程序時調用。有關更多信息,請致電activity lifecycle。因此,如果您希望在活動暫停時繼續播放音頻,請將方法替換爲onDestroy(調用finish()時調用此方法

+0

我將會看看這個解決方案,它看起來很有意義。謝謝 – carlosx2

1

運行後臺服務,並在該服務中播放的音頻(媒體播放器)和你一樣在方法釋放mediaPlayer可以使用前景通知從通知

+0

事情是,玩家將被用於所有活動,我不確定我可以爲服務中的所有活動設置歌曲信息。另外,我必須找到有關使用網址流式音樂的教程。 – carlosx2

+0

U可以使用mediaplayer在活動,但我會推薦後臺服務,這個任務與一個好看的通知還choisce是你的..在你的代碼中,你正在使用mediaplayer.setDatasource(url)所以你不需要找到一個關於使用URL流媒體音樂教程 你可以從這個樣本媒體播放器加上這個獲得很多幫助音樂播放器有一個很好的用戶界面也 https://github.com/play/play-playroid –

+0

謝謝,我會檢查出來。 – carlosx2