【问题标题】:Notification Icon from URL Exoplayer来自 URL Exoplayer 的通知图标
【发布时间】:2018-09-06 18:28:08
【问题描述】:

我正在尝试在使用 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()
    }
}

提前致谢。

【问题讨论】:

    标签: android exoplayer


    【解决方案1】:

    你可以在重写的函数 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)
                }
            })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      相关资源
      最近更新 更多