Невозможно добавить элемент мультимедиа в очередь с помощью контроллера мультимедиа

Я пытаюсь создать проигрыватель подкастов. Следуйте исходному коду Android Universal Media Player. Проблема, с которой я столкнулся, заключается в том, что я заранее не знаю свой список воспроизведения, а создание списка воспроизведения зависит от взаимодействия с пользователем. Поэтому мне нужно добавить/удалить элементы мультимедиа из моей активности/фрагмента. Мой код очень похож на пример приложения UMP, также я изменил mediaSession MusicService.

из

// Create a new MediaSession.
    mediaSession = MediaSessionCompat(this, "MusicService")
            .apply {
                setSessionActivity(sessionActivityPendingIntent)
                isActive = true
            }

to

// Create a new MediaSession.
    mediaSession = MediaSessionCompat(this, "MusicService")
            .apply {
                setSessionActivity(sessionActivityPendingIntent)
                isActive = true
                setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
                        or MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS
                        or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
            }

И я пытаюсь добавить элемент в очередь, как показано ниже.

fun addRandomMedia() {
    if (mediaSessionConnection.isConnected.value == true) {
        val mediaDescription = MediaDescriptionCompat.Builder()
                .setMediaId("wake_up_01")
                .setTitle("Intro - The Way Of Waking Up (feat. Alan Watts)")
                .setMediaUri(Uri.parse("https://storage.googleapis.com/uamp/The_Kyoto_Connection_-_Wake_Up/01_-_Intro_-_The_Way_Of_Waking_Up_feat_Alan_Watts.mp3"))
                .build()
        mediaSessionConnection.mediaController.addQueueItem(mediaDescription)
    }
}

Но я всегда получаю это исключение ниже

Process: com.example.android.uamp.next, PID: 8446
java.lang.UnsupportedOperationException: This session doesn't support queue management operations
    at android.support.v4.media.session.MediaControllerCompat$MediaControllerImplApi21.addQueueItem(MediaControllerCompat.java:1988)
    at android.support.v4.media.session.MediaControllerCompat.addQueueItem(MediaControllerCompat.java:316)
    at com.example.android.uamp.viewmodels.MainActivityViewModel.addItemToQueue(MainActivityViewModel.kt:118)
    at com.example.android.uamp.MainActivity$onCreate$3.onClick(MainActivity.kt:68)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Вот форма кода addQueueItem, поддерживающая медиа-пакет v4.

@Override
    public void addQueueItem(MediaDescriptionCompat description) {
        long flags = getFlags();
        if ((flags & MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
            throw new UnsupportedOperationException(
                    "This session doesn't support queue management operations");
        }
        Bundle params = new Bundle();
        params.putParcelable(COMMAND_ARGUMENT_MEDIA_DESCRIPTION, description);
        sendCommand(COMMAND_ADD_QUEUE_ITEM, params, null);
    }

Итак, я чувствую, что должны быть проблемы с методом getFlags, или я что-то здесь упускаю, так как проверка if всегда верна.

Чтобы воспроизвести эту проблему, я разветвил образец и добавил приведенный выше код в приложение. Вот ссылка на полный код Вот код для воспроизведения


person Dhiman Dasgupta    schedule 11.10.2018    source источник
comment
Вы нашли способ ее решить?   -  person Alexandru Circus    schedule 17.08.2019
comment
Привет @AlexandruCircus, В моем случае использования я использовал локальный широковещательный приемник, чтобы добавить элементы в очередь, куда я отправляю список объектов описания мультимедиа. Я смог использовать описанный выше подход, поскольку в моем случае использования не было функции «Добавить в очередь», мне нужно было заменить старую очередь новой очередью, поэтому это сработало для меня.   -  person Dhiman Dasgupta    schedule 18.08.2019


Ответы (1)


Вы используете MediaSessionConnector? Проблема в том, что флаги переопределяются в конструкторе MediaSessionConnector. Поэтому вам нужно вызвать mediaSession.setFlags(flags) после создания экземпляра MediaSessionConnector.

mediaSessionConnector = MediaSessionConnector(mediaSession).also {
        ...
        ...

   it.mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
                    or MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS
                    or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)

}

person ItGuideFromRussia    schedule 29.12.2019