mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Post notification for session app when FgS starting exception is caught
PiperOrigin-RevId: 502407886
This commit is contained in:
parent
abe11c88ec
commit
6ce3421ca7
2 changed files with 67 additions and 8 deletions
|
|
@ -15,22 +15,22 @@
|
||||||
*/
|
*/
|
||||||
package androidx.media3.demo.session
|
package androidx.media3.demo.session
|
||||||
|
|
||||||
import android.app.PendingIntent.FLAG_IMMUTABLE
|
import android.app.Notification.BigTextStyle
|
||||||
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
import android.app.NotificationChannel
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.app.PendingIntent.*
|
||||||
import android.app.TaskStackBuilder
|
import android.app.TaskStackBuilder
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import androidx.media3.common.AudioAttributes
|
import androidx.media3.common.AudioAttributes
|
||||||
import androidx.media3.common.MediaItem
|
import androidx.media3.common.MediaItem
|
||||||
|
import androidx.media3.common.util.Util
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
import androidx.media3.session.CommandButton
|
import androidx.media3.session.*
|
||||||
import androidx.media3.session.LibraryResult
|
|
||||||
import androidx.media3.session.MediaLibraryService
|
|
||||||
import androidx.media3.session.MediaSession
|
|
||||||
import androidx.media3.session.MediaSession.ControllerInfo
|
import androidx.media3.session.MediaSession.ControllerInfo
|
||||||
import androidx.media3.session.SessionCommand
|
|
||||||
import androidx.media3.session.SessionResult
|
|
||||||
import com.google.common.collect.ImmutableList
|
import com.google.common.collect.ImmutableList
|
||||||
import com.google.common.util.concurrent.Futures
|
import com.google.common.util.concurrent.Futures
|
||||||
import com.google.common.util.concurrent.ListenableFuture
|
import com.google.common.util.concurrent.ListenableFuture
|
||||||
|
|
@ -51,6 +51,8 @@ class PlaybackService : MediaLibraryService() {
|
||||||
"android.media3.session.demo.SHUFFLE_ON"
|
"android.media3.session.demo.SHUFFLE_ON"
|
||||||
private const val CUSTOM_COMMAND_TOGGLE_SHUFFLE_MODE_OFF =
|
private const val CUSTOM_COMMAND_TOGGLE_SHUFFLE_MODE_OFF =
|
||||||
"android.media3.session.demo.SHUFFLE_OFF"
|
"android.media3.session.demo.SHUFFLE_OFF"
|
||||||
|
private const val NOTIFICATION_ID = 123
|
||||||
|
private const val CHANNEL_ID = "demo_session_notification_channel_id"
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
|
|
@ -66,6 +68,7 @@ class PlaybackService : MediaLibraryService() {
|
||||||
)
|
)
|
||||||
customLayout = ImmutableList.of(customCommands[0])
|
customLayout = ImmutableList.of(customCommands[0])
|
||||||
initializeSessionAndPlayer()
|
initializeSessionAndPlayer()
|
||||||
|
setListener(MediaSessionServiceListener())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onGetSession(controllerInfo: ControllerInfo): MediaLibrarySession {
|
override fun onGetSession(controllerInfo: ControllerInfo): MediaLibrarySession {
|
||||||
|
|
@ -81,6 +84,7 @@ class PlaybackService : MediaLibraryService() {
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
player.release()
|
player.release()
|
||||||
mediaLibrarySession.release()
|
mediaLibrarySession.release()
|
||||||
|
clearListener()
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -259,4 +263,54 @@ class PlaybackService : MediaLibraryService() {
|
||||||
private fun ignoreFuture(customLayout: ListenableFuture<SessionResult>) {
|
private fun ignoreFuture(customLayout: ListenableFuture<SessionResult>) {
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private inner class MediaSessionServiceListener : Listener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is only required to be implemented on Android 12 or above when an attempt is made
|
||||||
|
* by a media controller to resume playback when the {@link MediaSessionService} is in the
|
||||||
|
* background.
|
||||||
|
*/
|
||||||
|
override fun onForegroundServiceStartNotAllowedException() {
|
||||||
|
createNotificationAndNotify()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createNotificationAndNotify() {
|
||||||
|
var notificationManagerCompat = NotificationManagerCompat.from(this)
|
||||||
|
ensureNotificationChannel(notificationManagerCompat)
|
||||||
|
var pendingIntent =
|
||||||
|
TaskStackBuilder.create(this).run {
|
||||||
|
addNextIntent(Intent(this@PlaybackService, MainActivity::class.java))
|
||||||
|
|
||||||
|
val immutableFlag = if (Build.VERSION.SDK_INT >= 23) FLAG_IMMUTABLE else 0
|
||||||
|
getPendingIntent(0, immutableFlag or FLAG_UPDATE_CURRENT)
|
||||||
|
}
|
||||||
|
|
||||||
|
var builder =
|
||||||
|
NotificationCompat.Builder(this, CHANNEL_ID)
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.setSmallIcon(R.drawable.media3_notification_small_icon)
|
||||||
|
.setContentTitle(getString(R.string.notification_content_title))
|
||||||
|
.setStyle(
|
||||||
|
NotificationCompat.BigTextStyle().bigText(getString(R.string.notification_content_text))
|
||||||
|
)
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
notificationManagerCompat.notify(NOTIFICATION_ID, builder.build())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ensureNotificationChannel(notificationManagerCompat: NotificationManagerCompat) {
|
||||||
|
if (Util.SDK_INT < 26 || notificationManagerCompat.getNotificationChannel(CHANNEL_ID) != null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val channel =
|
||||||
|
NotificationChannel(
|
||||||
|
CHANNEL_ID,
|
||||||
|
getString(R.string.notification_channel_name),
|
||||||
|
NotificationManager.IMPORTANCE_DEFAULT
|
||||||
|
)
|
||||||
|
notificationManagerCompat.createNotificationChannel(channel)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,4 +24,9 @@
|
||||||
<string name="no_item_prompt">
|
<string name="no_item_prompt">
|
||||||
"! No media in the play list !\nPlease try to add more from browser"
|
"! No media in the play list !\nPlease try to add more from browser"
|
||||||
</string>
|
</string>
|
||||||
|
<string name="notification_content_title">Playback cannot be resumed</string>
|
||||||
|
<string name="notification_content_text">Press on the play button on the media notification if it
|
||||||
|
is still present, otherwise please open the app to start the playback and re-connect the session
|
||||||
|
to the controller</string>
|
||||||
|
<string name="notification_channel_name">Playback cannot be resumed</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue