媒体 session 在 AOD 上有 "no title"(始终显示)
Media session has "no title" on AOD (Always on display)
在我的应用程序中,我显示了一个带有前台服务的通知,该服务负责播放音乐。通知由处理
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 上我看到 "No title" 显示。但如果我使用 Apple Music,它会很好地显示标题和艺术家。
我的应用程序:
苹果音乐:
我的问题是,如何根据我当前的实施配置此标题和文本?谢谢。
您可能需要像这样构建通知:
Notification.Builder(context, channel).setContentTitle("Title").setContentText("Description").build()
请在此处添加您的代码。帮助会更容易。
编辑:
您没有在适配器处返回标题:
override fun getCurrentContentTitle(player: Player?): String = "Add the title here"
我只是回答我自己的问题,因为我已经找到并解决了问题。
我只设置了通知的媒体描述适配器,但实际上媒体会话也需要设置元数据。
由于我们使用 mediaSessionConnector
,可以通过将 QueueNavigator
传递给 mediaSessionConnector
来设置它,因此我们可以使用播放器实例和 window 索引来构建当前媒体的元数据。 e.x:
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)
}
这里我使用 METADATA_KEY_TITLE
和 METADATA_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();
在我的应用程序中,我显示了一个带有前台服务的通知,该服务负责播放音乐。通知由处理
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 上我看到 "No title" 显示。但如果我使用 Apple Music,它会很好地显示标题和艺术家。
我的应用程序:
苹果音乐:
我的问题是,如何根据我当前的实施配置此标题和文本?谢谢。
您可能需要像这样构建通知:
Notification.Builder(context, channel).setContentTitle("Title").setContentText("Description").build()
请在此处添加您的代码。帮助会更容易。
编辑:
您没有在适配器处返回标题:
override fun getCurrentContentTitle(player: Player?): String = "Add the title here"
我只是回答我自己的问题,因为我已经找到并解决了问题。
我只设置了通知的媒体描述适配器,但实际上媒体会话也需要设置元数据。
由于我们使用 mediaSessionConnector
,可以通过将 QueueNavigator
传递给 mediaSessionConnector
来设置它,因此我们可以使用播放器实例和 window 索引来构建当前媒体的元数据。 e.x:
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)
}
这里我使用 METADATA_KEY_TITLE
和 METADATA_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();