android 10 通知上的搜索栏

som*_*ant 5 notifications android seekbar

有谁知道android 10通知中的seekbar功能吗?

我似乎无法让位置指示器显示当前位置。该栏只是空白,但我可以单击通知中的栏来查找媒体。

我有正常的通知生成器代码,并且添加了此代码以使搜索栏在 libvlc 的“MediaPlayer.Event.Playing”事件中可单击

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());
Run Code Online (Sandbox Code Playgroud)

媒体播放大约一半,但没有指示其位置。

通知

Moh*_*avi 9

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

  • 第 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()
)
Run Code Online (Sandbox Code Playgroud)
  • 第 2 步:添加ACTION_SEEK_TO到所有PlaybackStateCompat.setAction()方法中
  • 步骤 3:提供有效的 currentPosition(以毫秒为单位)和播放项目的当前状态,然后将它们传递给 PlaybackStateCompat.setState()方法。
  • 步骤 4:使用以下命令将 playBackState 对象设置为您的 mediaSessionsetPlaybackState()
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()
    )
}
Run Code Online (Sandbox Code Playgroud)
@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
        }
    }
Run Code Online (Sandbox Code Playgroud)
  • 步骤5:支持用户触摸SeekBar重写onSeekTo(pos: Long)方法MediaSessionCompat.Callback()
class PlayerMediaSessionCallback(mediaPlayer: MediaPlayer?) : MediaSessionCompat.Callback() {

// other callback methods

    override fun onSeekTo(pos: Long) {
        mediaPlayer?.seekTo(pos)
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 注意:记住在播放器发生状态更改时调用updateMediaPlaybackState()showNotification()播放、暂停、skipNext、skipPrevious、seek 等)


som*_*ant 0

更新:它似乎确实显示了位置,但当通知的颜色为深色时很难看到。由于某种原因,搜索栏没有根据通知颜色反转其颜色。

如果有人遇到此问题,请将通知背景设为白色,并查看它是否正在跟踪位置。

所以现在我需要弄清楚如何让栏在深色背景上显示浅色

通知