Медиа-плеер в фоновом режиме - PullRequest
1 голос
/ 11 апреля 2020

Вот код, который у меня есть, который создает аудиоплеер и позволяет пользователю моего приложения прослушивать музыку c. Как включить звук в фоновом режиме, когда телефон переходит в режим сна? Я хочу внести минимальные изменения в этот код ниже, насколько это возможно. Это возможно?

class AudioActivity : BaseActivity() {

    private lateinit var mediaPlayer: MediaPlayer
    private lateinit var runnable: Runnable
    private var handler: Handler = Handler()
    private var pause: Boolean = false
    private var working: Boolean = false
    private var removeFromLibrary: Boolean = false;


    private fun stop () {
        try {
            if ((mediaPlayer.isPlaying || pause.equals(true))) {
                pause = false
                seek_bar.setProgress(0)
                mediaPlayer.stop()
                mediaPlayer.reset()
                mediaPlayer.release()
                handler.removeCallbacks(runnable)

                tv_pass.text = ""
                tv_due.text = ""
            }
        } catch(e: UninitializedPropertyAccessException) {
            // media player is not initialized
        }
    }

    override fun onStop() {
        super.onStop()

        stop()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_audio)

        setProgressBar(R.id.progressBar)


        // Start the media player
        playBtn.setOnClickListener {
            if (!working) {
                working = true

                if (pause && mediaPlayer.isPlaying) {
                    playBtn.setImageResource(R.drawable.ic_play_circle_filled);
                    mediaPlayer.pause()
                } else {
                    playBtn.setImageResource(R.drawable.pausebtn);

                    if (pause) {
                        mediaPlayer.seekTo(mediaPlayer.currentPosition)
                        mediaPlayer.start()
                    } else {
                        mediaPlayer = MediaPlayer.create(applicationContext, Uri.parse(intent.getStringExtra("audio")))
                        mediaPlayer.start()
                    }
                    initializeSeekBar()

                    mediaPlayer.setOnCompletionListener {
                        Toast.makeText(this, "end", Toast.LENGTH_SHORT).show()
                    }
                }

                pause = !pause;
                working = false
            }
        }

        prevBtn.setOnClickListener {
            if (!working) {
                working = true
                try {
                    mediaPlayer.seekTo(mediaPlayer.currentPosition + (-10*1000))

                } catch(e: UninitializedPropertyAccessException) {
                    // media player is not initialized
                }
                working = false
            }
        }


        nextBtn.setOnClickListener {
            if (!working) {
                working = true
                try {
                    mediaPlayer.seekTo(mediaPlayer.currentPosition + (10*1000))
                } catch(e: UninitializedPropertyAccessException) {
                    // media player is not initialized
                }
                working = false
            }

        }

        // Seek bar change listener
        seek_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
                if (b) {
                    try {
                        mediaPlayer.seekTo(i * 1000)
                    } catch(e: UninitializedPropertyAccessException) {
                        // media player is not initialized
                    }
                }
            }

            override fun onStartTrackingTouch(seekBar: SeekBar) {
            }

            override fun onStopTrackingTouch(seekBar: SeekBar) {
            }
        })
    }

    // Method to initialize seek bar and audio stats
    private fun initializeSeekBar() {
        seek_bar.max = mediaPlayer.seconds

        runnable = Runnable {
            seek_bar.progress = mediaPlayer.currentSeconds

            var minutesaddum = "";
            var secondsaddum = ""
            val minutes = mediaPlayer.currentSeconds  / 60
            val seconds = mediaPlayer.currentSeconds  % 60

            if (minutes < 10) {
                minutesaddum = "0"
            }
            if (seconds < 10) {
                secondsaddum = "0"
            }
            tv_pass.text = "${minutesaddum}${minutes}:${secondsaddum}${seconds}"
            val diff = mediaPlayer.seconds - mediaPlayer.currentSeconds


            var minutesdiffaddum = "";
            var secondsdiffaddum = ""
            val minutesdiff = diff  / 60
            val secondsdiff = diff  % 60


            if (minutesdiff < 10) {
                minutesdiffaddum = "0"
            }
            if (secondsdiff < 10) {
                secondsdiffaddum = "0"
            }

            tv_due.text = "${minutesdiffaddum}${minutesdiff}:${secondsdiffaddum}${secondsdiff}"

            handler.postDelayed(runnable, 1000)
        }
        handler.postDelayed(runnable, 1000)
    }

// Creating an extension property to get the media player time duration in seconds
val MediaPlayer.seconds: Int
    get() {
        return this.duration / 1000
    }

// Creating an extension property to get media player current position in seconds
val MediaPlayer.currentSeconds: Int
    get() {
        return this.currentPosition / 1000
    }

1 Ответ

1 голос
/ 11 апреля 2020

, если вам нужно создать медиаплеер, играемый в фоновом режиме. Я предлагаю лучше Вам сначала нужно создать Сервис. Эта служба будет постоянно воспроизводить медиаплеер, даже если вы закроете приложение.

Не забудьте также создать уведомление. Это уведомление будет поддерживать службу как код: startForeground (0, уведомление);

Пример из Android: https://developer.android.com/guide/components/services

Надеюсь, эта помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...