Я пытаюсь создать проигрыватель фоновой музыки, используя библиотеку media3. Медиаплеер работает нормально, но уведомления начинают мерцать всякий раз, когда я добавляю прослушиватель в основное действие для обновлений на переднем плане в действии.
Строка, вызывающая проблему
val controllerFuture = MediaController.Builder(this@MainActivity, sessionToken).buildAsync()
Иногда уведомление формируется без кнопок поиска, но обновляется, когда я нажимаю любую кнопку в уведомлении. После удаления вышеуказанной строки уведомление работает без проблем.
Фрагмент кода
@androidx.annotation.OptIn(UnstableApi::class)
@RequiresApi(Build.VERSION_CODES.O)
private fun startPlayerServiceWithNewMedia(playlist: ArrayList, startIndex: Int = 0) {
val intent = Intent(requireContext(), PlayerService::class.java).apply {
putParcelableArrayListExtra("playList", playlist)
putExtra("startIndex", startIndex)
action = "ACTION_PLAY_NEW"
}
requireContext().startForegroundService(intent)
}
Служба кода
@UnstableApi
class PlayerService : MediaSessionService(), MediaSession.Callback {
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 ?: " ")
.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("MyTag", "Invalid media index")
}
}
@RequiresApi(Build.VERSION_CODES.O)
private fun setupPlayerNotification() {
playerNotificationManager =
PlayerNotificationManager.Builder(this, 1001, "playback_channel1")
.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
) {
Log.d("MyTag", "Notification posted: ongoing=$ongoing")
if (ongoing && !isForegroundService) {
startForeground(notificationId, notification)
isForegroundService = true
}
}
})
.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)
}
override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession {
Log.d("MyTag","Session in $mediaSession")
return mediaSession
}
override fun onDestroy() {
playerNotificationManager.setPlayer(null)
mediaSession.release()
player.release()
super.onDestroy()
}
}
Активность кода
@UnstableApi
override fun onStart() {
super.onStart()
val sessionToken = SessionToken(this, ComponentName(this, PlayerService::class.java))
val controllerFuture = MediaController.Builder(this@MainActivity, sessionToken).buildAsync()
controllerFuture.addListener({
try {
val mediaController = controllerFuture.get()
if (mediaController != null) {
// setupMediaController(mediaController)
Log.e("MyTag", "SetUp Controller")
} else {
Log.d("MyTag", "Failed to get MediaController")
}
} catch (e: Exception) {
Log.d("MyTag", "Error building MediaController", e)
}
}, MoreExecutors.directExecutor())
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... istener-in
Уведомление PlayerNotificationManager начинает мерцать при добавлении прослушивателя в Activity ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
При использовании Media3 PlayerNotificationManager создаются два уведомления.
Anonymous » » в форуме Android - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как создается первый экземпляр Activity из Activity.Current в веб-API asp.net?
Гость » » в форуме C# - 0 Ответы
- 60 Просмотры
-
Последнее сообщение Гость
-