Now I am developing an application to play music using the Media3 library. Now in the service class I have added custom actions (play next, play Previous) and it works perfectly as shown in the code below.
her is my code
class PlayerService : MediaSessionService(){
private var mediaSession : MediaSession? = null
private val stopCommand = SessionCommand("Stop" , Bundle.EMPTY)
private val nextMediaItemCommand = SessionCommand("Next" , Bundle.EMPTY)
private val previousMediaItemCommand = SessionCommand("Previous" , Bundle.EMPTY)
@OptIn(UnstableApi::class)
override fun onCreate() {
super.onCreate()
val player = ExoPlayer.Builder(this).build()
player.repeatMode = Player.REPEAT_MODE_ALL
mediaSession = MediaSession.Builder(this , player)
.setCallback(MyCallback())
.setCustomLayout(setCustomLayout())
.build()
notificationService()
}
@OptIn(UnstableApi::class)
private fun notificationService() {
NotificationCompat
.Builder(this , "SERVICE")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setStyle(MediaStyleNotificationHelper.MediaStyle(mediaSession!!))
.setContentTitle("Service")
.setContentText("Service is running")
.build()
}
override fun onGetSession(controllerInfo : MediaSession.ControllerInfo) : MediaSession? = mediaSession
override fun onDestroy() {
super.onDestroy()
mediaSession?.run {
release()
player.release()
mediaSession = null
}
}
private fun setCustomLayout() : ImmutableList<CommandButton>{
val previous = CommandButton.Builder()
.setDisplayName("Skip to Previous")
.setIconResId(R.drawable.skip_previous)
.setSessionCommand(previousMediaItemCommand)
.build()
val next = CommandButton.Builder()
.setDisplayName("Skip to Next")
.setIconResId(R.drawable.skip_next)
.setSessionCommand(nextMediaItemCommand)
.build()
val stop = CommandButton.Builder()
.setDisplayName("Stop Playing")
.setIconResId(R.drawable.baseline_close_24)
.setSessionCommand(stopCommand)
.build()
return ImmutableList.of(previous , next , stop)
}
private inner class MyCallback : MediaSession.Callback{
@OptIn(UnstableApi::class)
override fun onConnect(
session : MediaSession ,
controller : MediaSession.ControllerInfo
) : ConnectionResult {
return AcceptedResultBuilder(session)
.setAvailablePlayerCommands(
ConnectionResult.DEFAULT_PLAYER_COMMANDS.buildUpon()
.remove(Player.COMMAND_SEEK_TO_NEXT)
.remove(Player.COMMAND_SEEK_TO_PREVIOUS)
.remove(Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)
.remove(Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)
.build()
)
.setAvailableSessionCommands(
ConnectionResult.DEFAULT_SESSION_COMMANDS.buildUpon()
.add(stopCommand)
.add(nextMediaItemCommand)
.add(previousMediaItemCommand)
.build()
)
.build()
}
override fun onCustomCommand(
session : MediaSession ,
controller : MediaSession.ControllerInfo ,
customCommand : SessionCommand ,
args : Bundle
) : ListenableFuture<SessionResult> {
if (customCommand.customAction == "Stop") {
onDestroy()
} else if (customCommand.customAction == "Next") {
session.player.seekToNextMediaItem()
} else if (customCommand.customAction == "Previous") {
session.player.seekToPreviousMediaItem()
}
return super.onCustomCommand(session , controller , customCommand , args)
}
override fun onAddMediaItems(
mediaSession : MediaSession ,
controller : MediaSession.ControllerInfo ,
mediaItems : MutableList<MediaItem>
) : ListenableFuture<MutableList<MediaItem>> {
Log.d("add" , "yes")
val _mediaItems = mediaItems.map {musicItem ->
musicItem.buildUpon()
.setUri(musicItem.mediaId)
.build()
}.toMutableList()
return Futures.immediateFuture(_mediaItems)
}
}
}
Note I have added MediaItems to the Player from UI
The problem is when pressing one of these buttons to updates the current MediaItem, such as adding MediaMetadata For this purpose I use the following code inside the custom command action in MyCallback class :
session.player.replaceMediaItem(
session.player.currentMediaItemIndex ,
MediaItem.Builder()
.setMediaId(session.player.currentMediaItem?.mediaId!!)
.setMediaMetadata(MediaMetadata.Builder().setArtworkUri(//setartworkUri)
.build())
.build()
)
when I run the application, it crashes and I get the following exception:
Process: com.example.aplayer, PID: 25308
java.lang.NullPointerException
at androidx.media3mon.util.Assertions.checkNotNull(Assertions.java:155)
at androidx.media3.exoplayer.source.DefaultMediaSourceFactory.createMediaSource(DefaultMediaSourceFactory.java:457)
at androidx.media3.exoplayer.ExoPlayerImpl.createMediaSources(ExoPlayerImpl.java:1971)
at androidx.media3.exoplayer.ExoPlayerImpl.replaceMediaItems(ExoPlayerImpl.java:767)
at androidx.media3mon.BasePlayer.replaceMediaItem(BasePlayer.java:83)
at com.example.aplayer.data.PlayerService$MyCallback.onCustomCommand(PlayerService.kt:128)
at androidx.media3.session.MediaSessionImpl.onCustomCommandOnHandler(MediaSessionImpl.java:735)
at androidx.media3.session.MediaSessionLegacyStub.lambda$onCustomAction$1$androidx-media3-session-MediaSessionLegacyStub(MediaSessionLegacyStub.java:310)
at androidx.media3.session.MediaSessionLegacyStub$$ExternalSyntheticLambda6.run(D8$$SyntheticClass:0)
at androidx.media3.session.MediaSessionLegacyStub.lambda$dispatchSessionTaskWithSessionCommandInternal$22$androidx-media3-session-MediaSessionLegacyStub(MediaSessionLegacyStub.java:760)
at androidx.media3.session.MediaSessionLegacyStub$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)
at androidx.media3mon.util.Util.postOrRun(Util.java:794)
at androidx.media3.session.MediaSessionLegacyStub.dispatchSessionTaskWithSessionCommandInternal(MediaSessionLegacyStub.java:729)
at androidx.media3.session.MediaSessionLegacyStub.dispatchSessionTaskWithSessionCommand(MediaSessionLegacyStub.java:713)
at androidx.media3.session.MediaSessionLegacyStub.onCustomAction(MediaSessionLegacyStub.java:306)
at androidx.media3.session.legacy.MediaSessionCompat$Callback$MediaSessionCallbackApi21.onCustomAction(MediaSessionCompat.java:1656)
at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1656)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.app.ActivityThread.main(ActivityThread.java:8919)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
Is there any solution to this problem or instructions to update the MediaItem in the MediaSessionService class
发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745288112a4620687.html
评论列表(0条)