2

我正在尝试在音频应用程序文档以及媒体样式文档中讨论的音频 Android 应用程序中使用 MediaStyle 通知。我能够成功地显示带有功能传输控件的通知,所以我相信我的实现是合理的。但是,当我按照建议设置androidx.media.app.NotificationCompat.MediaStylevia.setStyle()NotificationCompat.Builder,它似乎忽略了该.setOngoing()标志的任何使用。setOngoing根据源代码确保“通知不能被驳回”。我在没有设置媒体样式时遇到了所描述的行为,但在我使用.setStyle().

我想知道是否有人知道解决方法,或者是否有一些未记录的要求我需要安抚以使用.setOngoing()媒体样式通知。我的编译 SDK 版本、目标 SDK 版本和最小 SDK 版本都是 30。请让我知道是否有任何其他代码有用;我相信我正在提供相关的内容。

为了说明这种困境,我提供了屏幕截图,显示了在应用媒体样式时通知如何被关闭,而在不应用媒体样式时通知如何被关闭。

采用媒体风格: 有媒体风格

没有媒体风格: 没有媒体风格

依赖项(全部是最新的):

val appCompatVersion: String = "1.4.0-alpha01"
val mediaVersion: String = "1.4.0-alpha01"
val media2Version: String = "1.0.0-alpha04"

implementation("androidx.appcompat:appcompat:$appCompatVersion")
implementation("androidx.media:media:$mediaVersion")
implementation("androidx.media2:media2:$media2Version")
private val notification: Notification?
        get() {
            val controller: MediaControllerCompat = mediaSession.controller ?: return null
            val description: MediaDescriptionCompat = controller.metadata?.description ?: return null
            val notificationManager: NotificationManager = notificationManager ?: return null

            val notificationChannel = NotificationChannel(
                CHANNEL_ID,
                CHANNEL_NAME,
                NotificationManager.IMPORTANCE_NONE
            )

            if (notificationChannel !in notificationManager.notificationChannels) {
                notificationManager.createNotificationChannel(notificationChannel)
            }

            ...

            val style = androidx.media.app.NotificationCompat.MediaStyle()
                .setMediaSession(controller.sessionToken)
                .setShowActionsInCompactView(0, 1, 2)
                .setShowCancelButton(false)

            return NotificationCompat.Builder(
                this,
                CHANNEL_ID
            ).apply {
                actions.forEach { addAction(it) }
                color = backgroundColor
            }
                .setContentTitle(description.title)
                .setContentText(description.subtitle)

                .setSmallIcon(smallIcon)
                .setLargeIcon(largeIcon)

                .setOngoing(true)
                .setColorized(true)
                .setAutoCancel(false)
                .setAllowSystemGeneratedContextualActions(true)

                .setContentIntent(controller.sessionActivity)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)

                .setChannelId(CHANNEL_ID)
                .setStyle(style)
                .build()
        }
4

2 回答 2

1

Android 通知肯定是神秘的,我不完全确定为什么我的应用程序的行为与使用相同方法的其他应用程序(Music Player GOUAMP)不同。我猜这种差异是由于包版本或导入,因为即使尝试导入MediaStyle考虑到媒体库从未完全移植到androidx,这真是一团糟。我发现,虽然媒体样式通知最初可以通过滑动关闭,但它仍然作为扩展通知保留在扩展菜单中。我对此很好,因为通知可以在某处访问。但是,我希望用户可以切换其在通知窗格中的位置,因为滑动似乎是将其隔离到扩展通知窗格的任意操作。我还发现这种行为仅.setMediaSession()由于androidx.media.app.NotificationCompat.MediaStyle. 如果我不设置媒体风格的媒体会话,我会得到一些传统的持续通知风格和现代媒体通知风格的混合体。我将提供一个包含不同通知样式的矩阵

没有媒体风格(不可解雇): 没有媒体风格(不可解雇)

具有媒体风格且未设置媒体会话(不可关闭): 具有媒体风格且不设置媒体会话(不可关闭)

具有媒体风格和设置媒体会话(可关闭): 具有媒体风格和设置媒体会话(可关闭)

使用媒体样式并将媒体会话设置为关闭: 具有媒体风格并将媒体会话设置为关闭

于 2021-06-07T22:16:59.197 回答
0

我面临着同样的问题。在将它设置setPlaybackState为 mediasession 后,它对我来说是固定的。

mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1f)
        .build()
)

检查此链接以获取正确的参数setStatehttps://developer.android.com/reference/kotlin/android/support/v4/media/session/PlaybackStateCompat.Builder

下面是我的完整媒体会话。确保为您的音频设置正确的参数值,例如持续时间等。

private fun createMediaSession(): MediaSessionCompat {
    val mediaSession = MediaSessionCompat(this, "tag")

    mediaSession.setMetadata(MediaMetadataCompat.Builder()
        .putLong(MediaMetadata.METADATA_KEY_DURATION, -1L)
        .build())

    mediaSession.setRepeatMode(PlaybackStateCompat.REPEAT_MODE_ONE)
    mediaSession.setFlags(0)

    mediaSession.setPlaybackState(
        PlaybackStateCompat.Builder()
            .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1f)
            .build()
    )

    return mediaSession
}
于 2021-10-21T10:58:15.477 回答