来自URL Exoplayer的通知图标

时间:2018-09-06 18:28:08

标签: android exoplayer

我正在尝试在使用exoplayer的播放器中设置通知图标。我有一个播放列表,正在使用concatenatingMediaSource。我有每首歌的专辑封面网址,但我不知道如何将其设置为通知图标。我阅读了一些建议使用AsyncTask并创建onPostExecute()通知的答案,但我看不到如何在exoplayer playerNotificationManager中进行操作。 这是我的音频服务课程:-

class  AudioPlayerService: Service() {
    private var player: SimpleExoPlayer? = null
    private var playerNotificationManager: PlayerNotificationManager? = null
    private var mediaSession: MediaSessionCompat? = null
    private var mediaSessionConnector: MediaSessionConnector? = null

    private var songList: ArrayList<MetaData>? = null

    private var context: Context? = null

    override fun onCreate() {
        super.onCreate()

        context = this

        val descriptionAdapter = object : PlayerNotificationManager.MediaDescriptionAdapter {

            override fun getCurrentContentTitle(player: Player?): String {
                return songList!![player!!.currentWindowIndex].name
            }

            override fun getCurrentContentText(player: Player?): String? {
                return songList!![player!!.currentWindowIndex].artist
            }

            override fun getCurrentLargeIcon(player: Player?, callback: PlayerNotificationManager.BitmapCallback?): Bitmap? {
                return null
            }

            override fun createCurrentContentIntent(player: Player?): PendingIntent? {
                val intent = Intent(context, MainActivity::class.java)
                return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
            }
        }

        playerNotificationManager = PlayerNotificationManager.createWithNotificationChannel(
                this, "1", R.string.notification_name, 1, descriptionAdapter
        )

        val notificationListener = object : PlayerNotificationManager.NotificationListener {
            override fun onNotificationStarted(notificationId: Int, notification: Notification?) {
                startForeground(notificationId, notification)
            }

            override fun onNotificationCancelled(notificationId: Int) {
                stopSelf()
            }
        }

        playerNotificationManager!!.setNotificationListener(
                notificationListener
        )

        mediaSession = MediaSessionCompat(context, "Test")
        mediaSession!!.isActive = true
        playerNotificationManager!!.setMediaSessionToken(mediaSession!!.sessionToken)

        mediaSessionConnector = MediaSessionConnector(mediaSession)

        val timelineQueueNavigator = object: TimelineQueueNavigator(mediaSession) {

            override fun getMediaDescription(player: Player?, windowIndex: Int): MediaDescriptionCompat {
                return getMediaDescription(songList!![windowIndex])
            }
        }

        mediaSessionConnector!!.setQueueNavigator(timelineQueueNavigator)
    }


    override fun onDestroy() {
        super.onDestroy()
        mediaSession!!.release()
        mediaSessionConnector!!.setPlayer(null, null)
        playerNotificationManager!!.setPlayer(null)
        player!!.release()
        player = null
    }

    override fun onBind(p0: Intent?): IBinder? {
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        songList = intent!!.getParcelableArrayListExtra<MetaData>("list")

        context = this
        player = ExoPlayerFactory.newSimpleInstance(this, DefaultTrackSelector())
        val dataSource = DefaultDataSourceFactory(
                this, Util.getUserAgent(this, getString(R.string.app_name)))
        val concatenatingMediaSource = ConcatenatingMediaSource()

        for(item in songList!!){
            val mediaSource = ExtractorMediaSource.Factory(dataSource)
                    .createMediaSource(Uri.parse(item.url))
            concatenatingMediaSource.addMediaSource(mediaSource)
        }

        player!!.prepare(concatenatingMediaSource)
        player!!.playWhenReady = true

        playerNotificationManager!!.setPlayer(player)

        mediaSessionConnector!!.setPlayer(player, null)

        return START_STICKY
    }

    private fun getMediaDescription(item: MetaData): MediaDescriptionCompat {
        return MediaDescriptionCompat.Builder()
                .setMediaId(item.id.toString())
                .setTitle(item.name)
                .setDescription(item.artist)
                .setMediaUri(Uri.parse(item.url))
                .build()
    }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以在重写函数getCurrentLargeIcon中使用Glide

override fun getCurrentLargeIcon(
                player: Player?,
                callback: PlayerNotificationManager.BitmapCallback?
            ): Bitmap? {
                loadBitmap(currentStation?.cover, callback)
                return null //or stub image
            }

private fun loadBitmap(url: String, callback: PlayerNotificationManager.BitmapCallback?) {
    Glide.with(this)
        .asBitmap()
        .load(url)
        .into(object : CustomTarget<Bitmap>() {
            override fun onResourceReady(
                resource: Bitmap,
                transition: Transition<in Bitmap>?
            ) {
                callback?.onBitmap(resource)
            }
        })
}