望风的懒蜗牛 2024-12-30 15:21 采纳率: 100%
浏览 16
已结题

android 通知不显示action icon

使用下面代码显示一个关于音乐播放器的通知。 通知有显示出来,但是使用addAction添加的三个icon看不到。
哪位指点一下,感谢!

img


private fun createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                WidgetMainActivity.CHANNEL_ID,
                "Music Service Channel",
                NotificationManager.IMPORTANCE_HIGH
            )
            channel.description = "Channel for music service notifications"
            val manager = getSystemService(NotificationManager::class.java)
            manager.createNotificationChannel(channel)
        }
    }

private fun initMediaSession(){
    mediaSession = MediaSessionCompat(this, "MusicService")
    mediaSession!!.isActive = true

    val metadata = MediaMetadataCompat.Builder()
        .putString(MediaMetadataCompat.METADATA_KEY_TITLE, "Music Title")
        .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "Artist Name")
        .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART,
            BitmapFactory.decodeResource(resources, R.drawable.music))
        .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, 30000)
        .build()
    mediaSession!!.setMetadata(metadata)

    val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_PLAYING, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN,
            1.0f, SystemClock.elapsedRealtime())
        .build()
    mediaSession!!.setPlaybackState(playbackState)
}

fun mediaNotification() {
    val previousIntent = Intent(this, NotificationReceiver::class.java)
        .setAction(WidgetMainActivity.ACTION_PREVIOUS)
    val pendingPreviousIntent = PendingIntent.getBroadcast(this,
        0,
        previousIntent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)

    val playPauseIntent = Intent(this, NotificationReceiver::class.java)
        .setAction(WidgetMainActivity.ACTION_PLAY_PAUSE)
    val pendingPlayPauseIntent = PendingIntent.getBroadcast(this,
        0,
        playPauseIntent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)

    val nextIntent = Intent(this, NotificationReceiver::class.java)
        .setAction(WidgetMainActivity.ACTION_NEXT)
    val pendingNextIntent = PendingIntent.getBroadcast(this,
        0,
        nextIntent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)

    val builder: NotificationCompat.Builder = NotificationCompat.Builder(this, WidgetMainActivity.CHANNEL_ID)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setStyle(androidx.media.app.NotificationCompat.MediaStyle()
            .setShowActionsInCompactView(0, 1, 2)
            .setMediaSession(mediaSession!!.sessionToken)) 
        .addAction(android.R.drawable.ic_media_previous, "Previous", pendingPreviousIntent) 
        .addAction(android.R.drawable.ic_media_pause, "Pause", pendingPlayPauseIntent) 
        .addAction(android.R.drawable.ic_media_next, "Next", pendingNextIntent)
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
        .setPriority(NotificationCompat.PRIORITY_MAX)
    val notificationManager = NotificationManagerCompat.from(this)
    notificationManager.notify(WidgetMainActivity.NOTIFICATION_ID, builder.build())
}
  • 写回答

2条回答 默认 最新

  • 望风的懒蜗牛 2024-12-31 11:49
    关注

    解决了,用法错了。
    应该是在PlaybackStateCompat.Builder 中使用setAction添加控制,NotificationCompat.Builder中的addAction不需要。
    修改代码如下:

    private fun createNotificationChannel() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val channel = NotificationChannel(
                    WidgetMainActivity.CHANNEL_ID,
                    "Music Service Channel",
                    NotificationManager.IMPORTANCE_HIGH
                ).apply {
                    description = "Channel for music service notifications"
                }
                getSystemService(NotificationManager::class.java)
                    .apply {
                        createNotificationChannel(channel)
                    }
            }
        }
    
        private fun initMediaSession() {
            // 更新MediaSession的元数据
            val metadata = MediaMetadataCompat.Builder()
                .apply {
                    putString(MediaMetadataCompat.METADATA_KEY_TITLE, "Music Title")
                    putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "Artist Name")
                    putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART,
                        BitmapFactory.decodeResource(resources, R.drawable.music))
                    putLong(MediaMetadataCompat.METADATA_KEY_DURATION, 30000)
                }
                .build()
    
            val playbackState = PlaybackStateCompat.Builder()
                .apply {
                    setState(PlaybackStateCompat.STATE_PLAYING, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN,
                        1.0f, SystemClock.elapsedRealtime())
                    setActions(PlaybackStateCompat.ACTION_PLAY
                            or PlaybackStateCompat.ACTION_PAUSE
                            or PlaybackStateCompat.ACTION_SKIP_TO_NEXT
                            or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)
                }
                .build()
    
            mediaSession = MediaSessionCompat(this, "MusicService").apply {
                isActive = true
                setMetadata(metadata)
                setPlaybackState(playbackState)
                setCallback(object : MediaSessionCompat.Callback() {
                    override fun onPlay() {
                        super.onPlay()
                        Log.d("TAG", "onPlay")
                    }
    
                    override fun onPause() {
                        super.onPause()
                        Log.d("TAG", "onPause")
                    }
    
                    override fun onSkipToNext() {
                        super.onSkipToNext()
                        Log.d("TAG", "onSkipToNext")
                    }
    
                    override fun onSkipToPrevious() {
                        super.onSkipToPrevious()
                        Log.d("TAG", "onSkipToPrevious")
                    }
    
                    override fun onFastForward() {
                        super.onFastForward()
                        Log.d("TAG", "onFastForward")
                    }
    
                    override fun onStop() {
                        super.onStop()
                        Log.d("TAG", "onStop")
                    }
                })
            }
        }
    
        fun mediaNotification() {
            val builder: NotificationCompat.Builder = NotificationCompat.Builder(this, WidgetMainActivity.CHANNEL_ID)
                .apply {
                    setSmallIcon(R.mipmap.ic_launcher)
                    setStyle(androidx.media.app.NotificationCompat.MediaStyle()
                        .setMediaSession(mediaSession!!.sessionToken)) // 需要MediaSession.Token
                    setVisibility(NotificationCompat.VISIBILITY_PUBLIC) // 设置通知的隐私级别
                    setPriority(NotificationCompat.PRIORITY_MAX)
                }
    
            val notificationManager = NotificationManagerCompat.from(this)
            notificationManager.notify(WidgetMainActivity.NOTIFICATION_ID, builder.build())
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 创建了问题 12月30日