在锁定屏幕上显示媒体播放器通知

时间:2020-05-04 15:42:40

标签: java android kotlin android-mediaplayer android-notifications

您好,我正在学习自己的媒体播放功能,并对是否可以在锁定屏幕上显示媒体播放器进度通知感到好奇。为此,我有一个活动类:

@Suppress("DEPRECATION")
class MainActivity : Activity() {

    private var mediaPlayer: MediaPlayer? = null

    override fun onPause() {
        super.onPause()
        killMediaPlayer()
    }//onPause ends

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        showNotification(0, 0)

        playButton.setOnClickListener {
            if (mediaPlayer != null &&
                    mediaPlayer!!.isPlaying) {
                Toast.makeText(applicationContext, "Already Playing!", Toast.LENGTH_SHORT).show()
            } else {
                initMediaPlayer()
            }
        }//playButton.setOnClickListener ends
    }//onCreate ends

    private fun initMediaPlayer() {
        mediaPlayer = MediaPlayer().apply {
            setAudioStreamType(AudioManager.STREAM_MUSIC)
            setDataSource("https://www.radiantmediaplayer.com/media/bbb-360p.mp4")
            prepare() // might take long! (for buffering, etc)
            start()
        }//apply ends

        initMediaPlayerListenerEvents()
    }//initMediaPlayer ends

    private fun initMediaPlayerListenerEvents() {
        if (mediaPlayer != null) {
            mediaPlayer!!.setOnInfoListener { mp, what, extra ->
                Log.e("streaX", "mediaPlayerInfo:::what:::$what".plus(" extra:::$extra"))
                false
            }

            mediaPlayer!!.setOnBufferingUpdateListener { mp, percent ->
//                Log.e("streaX", "mediaPlayerPercent:::$percent")
//                showOreoBasedNotification(applicationContext, "Singing", "Percent:::" + percent)
            }

            mediaPlayer!!.setOnErrorListener { mp, what, extra ->
                Log.e("streaX", "mediaPlayerError:::what:::$what".plus(" extra:::$extra"))
                true
            }

            Log.e("streaX", "mediaPlayerDuration:::${mediaPlayer!!.duration}")

            val mHandler = Handler()
            runOnUiThread(object : Runnable {
                override fun run() {
                    if (mediaPlayer != null) {
                        val mCurrentPosition: Int = mediaPlayer!!.currentPosition / 1000
                        Log.e("streaX", "mediaPlayerPosition:::$mCurrentPosition")
                        notification!!.setProgress((mediaPlayer!!.duration) / 1000, mCurrentPosition, false)
                        notificationManager.notify(1289, notification!!.build())
                    }
                    mHandler.postDelayed(this, 1000)
                }
            })
        }//media player not null
    }//initMediaPlayerListenerEvents ends

    private var notification: NotificationCompat.Builder? = null
    private val notificationId = "AudioStreamer12891226-3"
    private val notificationName = "AudioStreamer-Test-3"
    private lateinit var notificationManager: NotificationManager

    private fun showNotification(durationTotal: Int, mCurrentPosition: Int) {
        createNotificationChannel()
        notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        notification = NotificationCompat.Builder(applicationContext, notificationId)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setContentTitle("Playing BG Music")
                .setContentText("Media Player Playing...")
                .setSound(null)
                .setOnlyAlertOnce(true)
                .setProgress(durationTotal, mCurrentPosition, false)
                .setPriority(NotificationCompat.PRIORITY_LOW)

        notificationManager.notify(1289, notification!!.build())
    }//showNotification ends

    private fun createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val serviceChannel = NotificationChannel(
                    notificationId,
                    notificationName,
                    NotificationManager.IMPORTANCE_DEFAULT
            )
            val manager = getSystemService(NotificationManager::class.java)
            manager!!.createNotificationChannel(serviceChannel)
        }
    }//createNotificationChannel ends

    private fun killMediaPlayer() {
        if (mediaPlayer != null &&
                mediaPlayer!!.isPlaying) {
            mediaPlayer!!.stop()
            mediaPlayer!!.release()
            mediaPlayer = null
        }//media player null check ends
    }//killMediaPlayer ends
}//class ends

一切正常,当应用程序运行并且我单击按钮时,进度会根据Media Player Streams更新。但是问题是当我锁定设备时,通知根本不会出现。我正在使用Samsung J5来测试我的应用程序代码。

有人可以告诉我我做错了什么吗,如果装有Oreo Android的Samsung J5设备是否有可能在锁定屏幕上显示通知?

(我想显示这种通知)

enter image description here

0 个答案:

没有答案