安卓10通知栏上的拖动条

5

有人了解 Android 10 中通知栏上的 SeekBar 功能吗?

我似乎无法显示当前位置的指示器。这条线仅是空白,但我可以点击通知栏中的条来寻找媒体。

我已经使用普通的通知构建器代码,并在 libvlc 的 "MediaPlayer.Event.Playing" 事件中添加了以下内容,以使 SeekBar 可以被点击:

MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder();


metadataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, mMediaPlayer.getLength());

PlaybackStateCompat.Builder mStateBuilder = new PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_PLAYING,  1, 1.0f)
        .setBufferedPosition(mMediaPlayer.getLength())
        .setActions(
                PlaybackStateCompat.ACTION_PLAY |
                        PlaybackStateCompat.ACTION_PAUSE |
                        PlaybackStateCompat.ACTION_SKIP_TO_NEXT |
                        PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS |
                        PlaybackStateCompat.ACTION_SEEK_TO |
                        PlaybackStateCompat.ACTION_PLAY_PAUSE);


mediaSession.setMetadata(metadataBuilder.build());
mediaSession.setPlaybackState(mStateBuilder.build());

媒体播放已经进行了一半,但没有显示其位置指示器。 notification

这似乎只发生在某些设备上,而在其他设备上,进度条将显示得非常好。此外,在同一设备上,其他媒体播放器的进度条显示得非常好,例如Youtube、Youtube Red、Google Play Music等。我不确定是什么原因导致了这个问题,因为我在一个设备上也受到了影响,但在另一个设备上没有出现这个问题。 - punjabi4life
问题出在小通知图标上。请看这里的答案:https://stackoverflow.com/a/65545791/1775228 - NixSam
4个回答

9

经过长时间的搜索,我最终找到了解决方案。 请按以下步骤在Android 10或更高版本中将SeekBar显示在通知中。

  • 步骤1:将文件的持续时间以毫秒为单位作为Long值与键MediaMetadataCompat.METADATA_KEY_DURATION一起放入MediaSession.setMetadata中。
mediaSession.setMetadata(MediaMetadataCompat.Builder()
    .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, resource)
    .putString(
        MediaMetadataCompat.METADATA_KEY_ARTIST,
        activeBookFile.title
    )
    .putString(
        MediaMetadataCompat.METADATA_KEY_ALBUM,
        AudioPlayerService.activeBook.title
    )
    .putString(
        MediaMetadataCompat.METADATA_KEY_TITLE,
        AudioPlayerService.activeBook.title
    )
    .putLong(
        MediaMetadataCompat.METADATA_KEY_DURATION,
        activeBookFile.duration
    )
    .build()
)
  • Step 2:将ACTION_SEEK_TO添加到所有的PlaybackStateCompat.setAction()方法中
  • Step 3:在毫秒级别上提供有效的currentPosition和正在播放项目的当前状态,然后将它们传递给 PlaybackStateCompat.setState()方法
  • Step 4:使用setPlaybackState()方法将playBackState对象设置为您的mediaSession。
fun updateMediaPlaybackState(currentPos: Long) {
    mediaSession.setPlaybackState(
        PlaybackStateCompat.Builder()
            .setActions(
                PlaybackStateCompat.ACTION_PLAY
                        or PlaybackStateCompat.ACTION_PLAY_PAUSE
                        or PlaybackStateCompat.ACTION_PAUSE
                        or PlaybackStateCompat.ACTION_SKIP_TO_NEXT
                        or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
                        or PlaybackStateCompat.ACTION_SEEK_TO
            )
            .setState(
                getPlaybackState(),
                currentPos,
                1f,
                SystemClock.elapsedRealtime()
            )
            .build()
    )
}

@PlaybackStateCompat.State
private fun getPlaybackState(): Int {
        return when (currentState) {
            is PlayerStoppedState -> PlaybackStateCompat.STATE_STOPPED
            is PlayerPausedState -> PlaybackStateCompat.STATE_PAUSED
            is PlayerResumingState -> PlaybackStateCompat.STATE_PLAYING
            is PlayerLoadingState, is PlayerBufferingState -> PlaybackStateCompat.STATE_BUFFERING
            is PlayerErrorState -> PlaybackStateCompat.STATE_ERROR
            else -> PlaybackStateCompat.STATE_NONE
        }
    }

步骤5:为了支持用户在SeekBar上的触摸,重写MediaSessionCompat.Callback()中的onSeekTo(pos: Long)方法。
class PlayerMediaSessionCallback(mediaPlayer: MediaPlayer?) : MediaSessionCompat.Callback() {

// other callback methods

    override fun onSeekTo(pos: Long) {
        mediaPlayer?.seekTo(pos)
    }
}
  • 注意:每当您的播放器发生状态更改(如播放、暂停、跳过下一曲、跳过上一曲、快进等),请记得调用updateMediaPlaybackState()showNotification()

1
非常感谢,这非常有帮助!+1 - undefined
@JonathanF. 不客气。很高兴它对你有帮助。 - undefined

0
更新:看起来它确实显示了位置,但当通知颜色很暗时很难看到。 由于某种原因,滑动条没有根据通知颜色翻转其颜色。 如果有人遇到这个问题,请将通知的背景设为白色,并查看它是否正在跟踪位置。 现在,我需要找出如何在黑色背景上显示浅色的条形图。

notification


0

您需要添加一个白色小图标。不应使用其他颜色的图标。

NotificationCompat.Builder builder = new NotificationCompat.Builder(service,NOTIFICATION_CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_white)

0

您需要像这样添加歌曲的当前位置:.setState(if (isPlaying()) PlaybackStateCompat.STATE_PLAYING else PlaybackStateCompat.STATE_PAUSED, getCurrentPosition().toLong(), 1f)

示例-

val stateBuilder = PlaybackStateCompat.Builder()
            .setActions(MEDIA_SESSION_ACTIONS)
            .setState(
                if (isPlaying()) PlaybackStateCompat.STATE_PLAYING else PlaybackStateCompat.STATE_PAUSED,
                getCurrentPosition().toLong(), 1f
            )

        mediaSessionCompat.setPlaybackState(stateBuilder.build())

注意:以上代码是使用 Kotlin 编写的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接