Я пытаюсь создать проигрыватель фоновой музыки, используя библиотеку 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
При использовании Media3 PlayerNotificationManager создаются два уведомления. ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение