android - update Mediaitem on mediasessionservice (media3) - Stack Overflow

Now I am developing an application to play music using the Media3 library. Now in the service class I h

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

相关推荐

  • android - update Mediaitem on mediasessionservice (media3) - Stack Overflow

    Now I am developing an application to play music using the Media3 library. Now in the service class I h

    5小时前
    20

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信