媒体会话在 AOD 上“无标题”(始终显示)

Posted

技术标签:

【中文标题】媒体会话在 AOD 上“无标题”(始终显示)【英文标题】:Media session has "no title" on AOD (Always on display) 【发布时间】:2020-03-27 10:01:26 【问题描述】:

在我的应用程序中,我显示了一个带有前台服务的通知,该服务负责播放音乐。通知由 com.google.android.exoplayer2.ui.PlayerNotificationManager android.support.v4.media.session.MediaSessionCompat com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector

    mediaSession = MediaSessionCompat(this, "Player", null, null)
    mediaSession.isActive = true
    mediaSessionConnector = MediaSessionConnector(mediaSession)
    mediaSessionConnector.setPlayer(exoPlayer)
    playerNotificationManager = PlayerNotificationManager.createWithNotificationChannel(
            this,
            "notification_channel_player",
            R.string.notification_channel_name_player,
            0,
            PLAYER_NOTIFICATION_ID,
            object : PlayerNotificationManager.MediaDescriptionAdapter 
                override fun createCurrentContentIntent(player: Player?): PendingIntent? 
                    // intent
                

                override fun getCurrentLargeIcon(player: Player?, callback: PlayerNotificationManager.BitmapCallback?): Bitmap? 
                    // large icon
                

                override fun getCurrentContentText(player: Player?): String? 
                    // artist
                

                override fun getCurrentContentTitle(player: Player?): String 
                    // title
                

            ,
            object : NotificationListener 
                override fun onNotificationPosted(notificationId: Int, notification: Notification?, ongoing: Boolean) 
                    startForeground(notificationId, notification)
                
            )

    playerNotificationManager.setSmallIcon(R.drawable.ic_notification)
    // has previous and next
    playerNotificationManager.setUseNavigationActions(true)
    playerNotificationManager.setUseNavigationActionsInCompactView(true)
    // no fast-forward and rewind
    playerNotificationManager.setFastForwardIncrementMs(0)
    playerNotificationManager.setRewindIncrementMs(0)
    // no stop
    playerNotificationManager.setUseStopAction(false)

    playerNotificationManager.setMediaSessionToken(mediaSession.sessionToken)
    playerNotificationManager.setPlayer(exoPlayer)

当屏幕打开时,显示内容标题和文本没有问题。但是当我锁定屏幕并处于 AOD 模式时,在我的 Pixel 3 上我看到显示“无标题”。但是如果我使用 Apple Music,它会很好地显示标题和艺术家。

我的应用程序:

苹果音乐:

我的问题是,如何根据我当前的实现来配置这个标题和文本?谢谢。

【问题讨论】:

【参考方案1】:

我只是回答我自己的问题,因为我发现并解决了问题。

我只设置了通知的媒体描述适配器,但实际上媒体会话也需要设置元数据。 由于我们使用的是mediaSessionConnector,因此可以通过将QueueNavigator 传递给mediaSessionConnector 来设置它,因此我们可以使用播放器实例和窗口索引来构建当前媒体的元数据。例如:

    val timelineQueueNavigator = object : TimelineQueueNavigator(mediaSession) 
        override fun getMediaDescription(player: Player?, windowIndex: Int): MediaDescriptionCompat 
            player?.let  safePlayer ->
                return MediaDescriptionCompat.Builder().apply 
                    setTitle("......")
                    setSubtitle("......")
                .build()
            
            return MediaDescriptionCompat.Builder().build()
        
    
    mediaSessionConnector.setQueueNavigator(timelineQueueNavigator)

另外一点是,默认情况下mediaSessionConnector 使用MediaSessionConnector.DefaultMediaMetadataProvider。它不会设置METADATA_KEY_ARTIST,它将在 AOD 模式下作为艺术家使用。所以我创建了自己的 MediaMetadataProvider,添加了METADATA_KEY_ARTIST

if (description.subtitle != null) 
    val subTitle = description.subtitle.toString()
    builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, subTitle)
    builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, subTitle)

【讨论】:

【参考方案2】:

这里我使用METADATA_KEY_TITLEMETADATA_KEY_ARTIST 作为标题和描述:

MediaMetaData data = PlayerManager.getInstance().getCurrentMediaMetaData();
                        Bitmap bitmap = ((BitmapDrawable) AppController.getInstance().getResources().getDrawable(R.drawable.app_logo)).getBitmap();
                        Bundle extras = new Bundle();
                        extras.putString(MediaMetadataCompat.METADATA_KEY_TITLE,data.getMediaTitle());
                        extras.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, data.getMediaAlbum());
                        return new MediaDescriptionCompat.Builder()
                                .setIconBitmap(bitmap)
                                .setExtras(extras)
                                .build();

【讨论】:

【参考方案3】:

您可能必须像这样构建通知:

Notification.Builder(context, channel).setContentTitle("Title").setContentText("Description").build()

请在此处添加您的代码。提供帮助会更容易。

编辑:

您没有在适配器返回标题:

 override fun getCurrentContentTitle(player: Player?): String = "Add the title here"

【讨论】:

谢谢。我已经更新了我的问题。我似乎需要为媒体会话配置一些特定字段。 基本上我已经实现了所有的方法。我可以完美地看到通知,只是在 AOD 模式下我看到“没有标题”。

以上是关于媒体会话在 AOD 上“无标题”(始终显示)的主要内容,如果未能解决你的问题,请参考以下文章

无标题音视频实践日 Live|七牛云 QRTC 媒体传输质量优化实践

无标题音视频实践日 Live|七牛云 QRTC 媒体传输质量优化实践

无标题音视频实践日 Live|七牛云 QRTC 媒体传输质量优化实践

防止 <nav> 在 html5 网站上显示为“无标题部分”

无标题

卡验证始终显示 Azure 上的会话已过期