2016-03-28 257 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