From fa2207935bd9eea2ef7465f2a5d43ba5e76286b9 Mon Sep 17 00:00:00 2001 From: zhongerxll Date: Tue, 27 May 2025 15:33:47 -0500 Subject: [PATCH] Fix issue with system media controls not functioning correctly on Samsung devices with Android 15 --- .../app/service/BaseReadAloudService.kt | 36 +++++++++++++++---- .../java/io/legado/app/utils/RomExtensions.kt | 4 +++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 9742126bc..03190f4a7 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -48,6 +48,7 @@ import io.legado.app.utils.activityPendingIntent import io.legado.app.utils.broadcastPendingIntent import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.isVivoDevice +import io.legado.app.utils.isSamsungDevice import io.legado.app.utils.observeEvent import io.legado.app.utils.observeSharedPreferences import io.legado.app.utils.postEvent @@ -452,11 +453,34 @@ abstract class BaseReadAloudService : BaseService(), */ @SuppressLint("UnspecifiedImmutableFlag") private fun initMediaSession() { - mediaSessionCompat.setCallback(object : MediaSessionCompat.Callback() { - override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { - return MediaButtonReceiver.handleIntent(this@BaseReadAloudService, mediaButtonEvent) - } - }) + if (isSamsungDevice) { + mediaSessionCompat.setCallback(object : MediaSessionCompat.Callback() { + override fun onPlay() { + resumeReadAloud() + } + override fun onPause() { + pauseReadAloud() + } + override fun onSkipToNext() { + nextChapter() + } + override fun onSkipToPrevious() { + prevChapter() + } + override fun onStop() { + stopSelf() + } + override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { + return MediaButtonReceiver.handleIntent(this@BaseReadAloudService, mediaButtonEvent) + } + }) + } else { + mediaSessionCompat.setCallback(object : MediaSessionCompat.Callback() { + override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { + return MediaButtonReceiver.handleIntent(this@BaseReadAloudService, mediaButtonEvent) + } + }) + } mediaSessionCompat.setMediaButtonReceiver( broadcastPendingIntent(Intent.ACTION_MEDIA_BUTTON) ) @@ -523,7 +547,7 @@ abstract class BaseReadAloudService : BaseService(), private fun choiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { val mediaStyle = androidx.media.app.NotificationCompat.MediaStyle() .setShowActionsInCompactView(1, 2, 4) - if (isVivoDevice) { + if (isVivoDevice || isSamsungDevice) { //fix #4090 android 14 can not show play control in lock screen mediaStyle.setMediaSession(mediaSessionCompat.sessionToken) } diff --git a/app/src/main/java/io/legado/app/utils/RomExtensions.kt b/app/src/main/java/io/legado/app/utils/RomExtensions.kt index e83940c95..9638f152f 100644 --- a/app/src/main/java/io/legado/app/utils/RomExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/RomExtensions.kt @@ -5,3 +5,7 @@ import android.os.Build val isVivoDevice by lazy { Build.MANUFACTURER.equals("vivo", ignoreCase = true) } + +val isSamsungDevice by lazy { + Build.MANUFACTURER.equals("samsung", ignoreCase = true) +}