【问题标题】:Android studio audio stops playing when app is closed关闭应用程序时,Android Studio 音频停止播放
【发布时间】:2016-03-28 12:52:54
【问题描述】:

我正在我的应用中制作音频播放器。它正在使用视图列表,并且一切正常。我可以开始暂停,下一个音乐流。我正在加载一个 url 来播放音乐。当我关闭应用程序时,音乐停止播放。我需要继续玩。我读过一些关于音频焦点的东西。但我不确定如何将其添加到代码中。我的清单中有wake_lock。

我对 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 /////////////////////////////////////////

感谢您的帮助。

【问题讨论】:

  • 你应该使用服务来播放音频,而不是仅仅在活动中播放。

标签: java android audio android-studio


【解决方案1】:

看起来您在onPause 方法中释放了mediaPlayer。关闭应用程序时始终调用此方法。有关更多信息,请访问谷歌activity lifecycle。因此,如果您希望您的音频在活动暂停时继续播放 - 将 onPause 方法替换为 onDestroy (在调用 finish() 时会调用此方法。

【讨论】:

  • 我要看看这个解决方案,它似乎很有意义。谢谢
【解决方案2】:

运行后台服务并在该服务中播放您的音频(媒体播放器),您可以使用前台通知来控制该通知的暂停播放或下一步等

【讨论】:

  • 问题是播放器将用于所有活动,我不确定我是否可以为服务中的所有活动设置歌曲信息。另外,我必须找到有关使用 url 流音乐的教程。
  • 你可以在活动中使用媒体播放器,但我会推荐这个任务的后台服务,它有一个好看的通知,你也可以选择..在你的代码中你正在使用 mediaplayer.setDatasource(url) 所以你不要需要找到一个关于使用 url 流音乐的教程你可以从这个示例媒体播放器中获得很多帮助,而且这个音乐播放器也有一个很好的 UI github.com/play/play-android
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多