При использовании Media3 PlayerNotificationManager создаются два уведомления.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 При использовании Media3 PlayerNotificationManager создаются два уведомления.

Сообщение Anonymous »

Я пытаюсь создать проигрыватель фоновой музыки, используя библиотеку media3. Медиаплеер работает нормально, но каждый раз, когда я нажимаю следующую кнопку в уведомлении, создаются два уведомления: одно с кнопками поиска, другое без кнопок поиска. Оба уведомления работают синхронно друг с другом. При нажатии любой кнопки в уведомлении воспроизводится пауза следующего или поиск каждого из них работает идеально. Как я могу сохранить только одно уведомление
код
class PlayerService : MediaSessionService() {

private lateinit var player: ExoPlayer
private lateinit var mediaSession: MediaSession
private lateinit var playerNotificationManager: PlayerNotificationManager

private var mediaUrls = ArrayList()
private var currentMediaIndex = 0

private var isForegroundService = false

@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate() {
super.onCreate()

player = ExoPlayer.Builder(this).build().apply {
addListener(playerListener)
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(C.AUDIO_CONTENT_TYPE_MUSIC)
.setUsage(C.USAGE_MEDIA)
.build(),
true
)
setHandleAudioBecomingNoisy(true)
}

mediaSession = MediaSession.Builder(this, player).build()
setupPlayerNotification()
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
if (intent?.action == "ACTION_PLAY_NEW") {
handleNewMediaIntent(intent)
}
return START_STICKY
}

private fun handleNewMediaIntent(intent: Intent) {
val urls: ArrayList? = intent.getParcelableArrayListExtra("playList")
currentMediaIndex = intent.getIntExtra("startIndex", 0)

urls?.let {
mediaUrls.clear()
mediaUrls.addAll(it)
playCurrentMedia()
}
}

private fun playCurrentMedia() {
if (currentMediaIndex in mediaUrls.indices) {
val mediaItems = mediaUrls.mapNotNull { item ->
item.podcast_url?.let { url ->
MediaItem.Builder()
.setUri(url)
.setMediaMetadata(
MediaMetadata.Builder()
.setTitle(item.title ?: "Unknown Title")
.setArtworkUri(item.images?.get(0)?.mediumImage?.toUri())
.build()
)
.build()
}
}

player.setMediaItems(mediaItems)
player.seekTo(currentMediaIndex, C.TIME_UNSET)
player.prepare()
player.play()
} else {
Log.e("PlayerService", "Invalid media index")
}
}

@RequiresApi(Build.VERSION_CODES.O)
private fun setupPlayerNotification() {
playerNotificationManager = PlayerNotificationManager.Builder(
this, 1, "playback_channel"
)
.setMediaDescriptionAdapter(object : PlayerNotificationManager.MediaDescriptionAdapter {
override fun getCurrentContentTitle(player: Player): CharSequence {
return player.currentMediaItem?.mediaMetadata?.title ?: ""
}

override fun createCurrentContentIntent(player: Player): PendingIntent? {
val intent = Intent(this@PlayerService, MainActivity::class.java)
return PendingIntent.getActivity(
this@PlayerService,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
}

override fun getCurrentContentText(player: Player): CharSequence {
return "" // Add any content text here if needed
}

override fun getCurrentLargeIcon(
player: Player, callback: PlayerNotificationManager.BitmapCallback
): Bitmap? {
player.mediaMetadata.artworkData?.let { imageUrl ->
Glide.with(application)
.asBitmap()
.load(imageUrl)
.into(object : CustomTarget() {
override fun onResourceReady(
resource: Bitmap,
transition: Transition?
) {
callback.onBitmap(resource)
}

override fun onLoadCleared(placeholder: Drawable?) {}
})
}
return null
}
})
.setNotificationListener(object : PlayerNotificationManager.NotificationListener {
override fun onNotificationCancelled(
notificationId: Int,
dismissedByUser: Boolean
) {
if (dismissedByUser) {
stopSelf()
}
}

override fun onNotificationPosted(
notificationId: Int,
notification: Notification,
ongoing: Boolean
) {
if (ongoing && !isForegroundService) {
isForegroundService = true
} else if (!ongoing && isForegroundService) {
stopForeground(false)
isForegroundService = false
}
}
})
.setSmallIconResourceId(R.drawable.ic_launcher_foreground)
.setChannelNameResourceId(R.string.notification_channel_name)
.setChannelDescriptionResourceId(R.string.notification_channel_description)
.build()

playerNotificationManager.setMediaSessionToken(mediaSession.platformToken)
playerNotificationManager.setPlayer(player)
}

private val playerListener = object : Player.Listener {
override fun onPlaybackStateChanged(state: Int) {
when (state) {
Player.STATE_ENDED -> {
stopSelf()
stopForeground(STOP_FOREGROUND_REMOVE)
}

Player.STATE_BUFFERING -> {}
Player.STATE_IDLE -> {}
Player.STATE_READY -> {}
}
}
}

override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession {
return mediaSession
}

override fun onDestroy() {
playerNotificationManager.setPlayer(null)
mediaSession.release()
player.release()
super.onDestroy()
}
}


Подробнее здесь: https://stackoverflow.com/questions/789 ... ionmanager
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как использовать Glide for Media3 Уведомления Images в Media3?
    Anonymous » » в форуме Android
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Уведомление PlayerNotificationManager начинает мерцать при добавлении прослушивателя в Activity
    Anonymous » » в форуме Android
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Почему создаются два экземпляра одноэлементного класса Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Почему создаются два экземпляра одноэлементного класса Java?
    Anonymous » » в форуме Android
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Почему файлы-заглушки не создаются при использовании Pylance?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»