java - 应用程序关闭时 Android Studio 音频停止播放

标签 java android audio android-studio

我正在我的应用程序中制作一个音频播放器。它使用 View 列表,一切工作正常。我可以开始暂停,下一个音乐流。我正在加载一个播放音乐的网址。当我关闭应用程序时,音乐停止播放。我需要继续比赛。我读过一些有关音频焦点的内容。但我不确定如何将其添加到代码中。我的 list 中有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 /////////////////////////////////////////

感谢您的帮助。

最佳答案

看起来您在 onPause 方法中释放了 mediaPlayer 。当您关闭应用程序时,始终会调用此方法。欲了解更多信息,请谷歌搜索activity lifecycle 。因此,如果您希望音频在 Activity 暂停时继续播放,请用 onDestroy 替换 onPause 方法(该方法在调用 finish() 时调用。

关于java - 应用程序关闭时 Android Studio 音频停止播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36262754/

相关文章:

java - 从 Java 字符串中删除阿拉伯非字母数字字符

java - 无法实现 getIntent(); fragment 中的方法

iphone - 背景音频 - 锁定屏幕上的图像

c# - 录制某个应用程序的声音

android - 实现观察者模式的 fragment

ios - 使用 Swift 录制输出音频

java - 追踪 java.sql.SQLSyntaxErrorException : ORA-00900: invalid SQL statement 的来源

java - 我的辛普森法则计算器正确吗(java)?

android - ActivityManager 进程已死亡问题

android - 在使用 uiautomator 和 espresso 执行 AndroidTest 之前,如何在 Android 设备上设置允许模拟位置?