onLoadChildren отправил нулевой список для корневого идентификатора на сервис MediaBrowserServiceCompat

Я продолжаю получать эту ошибку на некоторых устройствах всякий раз, когда пользователь пытается воспроизвести некоторые треки с помощью моего медиаплеера.

Fatal Exception: java.lang.IllegalStateException: onLoadChildren sent null list for id root
       at android.service.media.MediaBrowserService$3.onResultSent(MediaBrowserService.java:473)
       at android.service.media.MediaBrowserService$3.onResultSent(MediaBrowserService.java:469)
       at android.service.media.MediaBrowserService$Result.sendResult(MediaBrowserService.java:131)
       at android.support.v4.media.MediaBrowserServiceCompatApi21$ResultWrapper.sendResult(MediaBrowserServiceCompatApi21.java:77)
       at android.support.v4.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$3.onResultSent(MediaBrowserServiceCompat.java:366)
       at android.support.v4.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$3.onResultSent(MediaBrowserServiceCompat.java:354)
       at android.support.v4.media.MediaBrowserServiceCompat$Result.sendResult(MediaBrowserServiceCompat.java:606)
       at com.radioafrica.music.playback.MusicPlaybackService.onLoadChildren(MusicPlaybackService.java:102)
       at android.support.v4.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi21.onLoadChildren(MediaBrowserServiceCompat.java:374)
       at android.support.v4.media.MediaBrowserServiceCompatApi21$MediaBrowserServiceAdaptor.onLoadChildren(MediaBrowserServiceCompatApi21.java:128)
       at android.service.media.MediaBrowserService.performLoadChildren(MediaBrowserService.java:495)
       at android.service.media.MediaBrowserService.addSubscription(MediaBrowserService.java:459)
       at android.service.media.MediaBrowserService.access$400(MediaBrowserService.java:68)
       at android.service.media.MediaBrowserService$ServiceBinder$3.run(MediaBrowserService.java:247)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:7325)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Мой код для onLoadChildren метод это:

 @Override
    public void onLoadChildren(@NonNull String s, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
        result.sendResult(null);
    }

Что вызывает сбой для некоторых пользователей и работает для других?

1 ответ

Я понимаю, что это более старый вопрос, но недавно я столкнулся с этим вопросом и хотел оставить ответ.

Это зависит от того, что вы отправляете в качестве корня вашего браузера в onGetRoot. Я следил за этой документацией для контроля соединений с onGetRoot, которая предлагает отдельный пустой корень для клиентов, которые имеют управление мультимедиа, но не имеют доступа к просмотру. Когда запрашивается этот корень, вам нужно отправить пустой список, а не нуль. Null зарезервирован для недопустимого идентификатора носителя в соответствии с документацией для MediaBrowserService.onLoadChildren.

Из того, что я могу сказать, устройства pre-N не обрабатывают нулевое значение надлежащим образом. Вот исходный код исключения, которое вы видите на Android M. Обратите внимание, что отправка нулевого списка вызывает это исключение. Поскольку новые стеки Bluetooth поддерживают просмотр мультимедиа, пакет bluetooth может пытаться подключиться к вашему сервису (существует множество устройств Samsung, таких как Galaxy Note 4, которые поддерживают поиск по Bluetooth и работают под управлением Android M, что может привести к сбою).

Получил следующий ответ от Гуглера в этом выпуске на трекере:

... это исправлена ​​проблема после N, и для устройств до N, если и браузер, и приложения-службы браузера используют библиотеку поддержки, это не должно происходить.

Я заменяю

result.sendResult(null);

с участием

 result.sendResult(Collections.<MediaBrowserCompat.MediaItem>emptyList()); 

в методе onloadChildren проблема решена для меня

Другие вопросы по тегам