MediaBrowser.subscribe не работает после того, как я возвращаюсь к действию 1 из упражнения 2 (6.0.1 Android)

Когда я открываю действие 1 (действие приложения "Основной / запуск"), которое включает в себя подключение к MediaBrowser, MediaBrowser.subscribe работает нормально (onChildrenLoaded вызывается после него), но когда я открыл какое-то другое мероприятие (номер 2) из ​​упражнения 1 (используя прослушиватель нажатия кнопки и намерение), а затем закрыл это действие 2, MediaBrowser.subscribe перестает работать - onChildrenLoaded НЕ вызывается после подписки, поэтому после завершения действия 2 onConnected SubscriptionCallback (действия 1) & mMediaBrowser.subscribe(MEDIA_ID_ROOT, mSubscriptionCallback); звонят, но мои предметы не обновляются, потому что onChildrenLoaded никогда не срабатывает

private MediaBrowserCompat.ConnectionCallback mConnectionCallback =
            new MediaBrowserCompat.ConnectionCallback() {
                @Override
                public void onConnected() {
                    Log.i(TAG, "onConnected");
                    mMediaBrowser.unsubscribe(MEDIA_ID_ROOT, mSubscriptionCallback);
                    mMediaBrowser.subscribe(MEDIA_ID_ROOT, mSubscriptionCallback);

                }
            };

private MediaBrowserCompat.SubscriptionCallback mSubscriptionCallback = new MediaBrowserCompat.SubscriptionCallback() {

        @Override
        public void onChildrenLoaded(String parentId, List<MediaBrowserCompat.MediaItem> children) {
            Log.i(TAG, "onChildrenLoaded"); // isn't being called on android 6.0.1 after I got back to this activity from other
        if (children != null) {
            if (mMediaItems != null) {
                mMediaItems.clear();
                mMediaItems = null;
            }
            mMediaItems = children;
            if (mAdapter == null) {
                mAdapter = new Adapter();
                mRecyclerView.setAdapter(mAdapter);
            } else {
                mAdapter.notifyDataSetChanged();
            }
        }
        }

        @Override
        public void onError(String id) {
            Log.i(TAG, "SubscriptionCallback onError");
        }
    };

Но работает нормально для 4.4.4 Android (таких проблем нет)

Обновить

Кажется, я нашел эту проблему в ошибках Google (некоторые разработчики сообщили об этом): https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=-has%3Asubcomponent%20-has%3Atarget%20emulator%20.&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened&groupby=&sort=&id=232455

Но нет решения

Также есть такая ошибка:

04-02 18:25:55.519 11250-11250/com.android.player W/MBServiceCompat: removeSubscription for callback that isn't registered id=hhhh
04-02 18:25:55.519 11250-11250/com.android.player W/MBServiceCompat: addSubscription for callback that isn't registered id=hhhh
04-02 18:25:55.525 11250-11250/com.android.player W/MBServiceCompat: removeSubscription for callback that isn't registered id=hhhh
04-02 18:25:55.525 11250-11250/com.android.player W/MBServiceCompat: addSubscription for callback that isn't registered id=hhhh

Обновление 2

Также там

https://github.com/googlesamples/android-UniversalMusicPlayer/issues/92

м.б. последний комментарий по этой ссылке тоже решит эту проблему для меня

Обновление 3

Да, github.com/googlesamples/android-UniversalMusicPlayer/issues/92#issuecomment-287668132 РЕШЕНО:

переместите MediaBrowserCompat.connect() из onStart() в onCreate() и переместите MediaBrowserCompat.disconnect() из onStop() в onDestroy(). Это работает сейчас.

3 ответа

Решение

Временное решение:

переместите MediaBrowserCompat.connect() из onStart() в onCreate() и переместите MediaBrowserCompat.disconnect() из onStop() в onDestroy(). Это работает сейчас.

Должно быть исправлено в v25.4.0: https://issuetracker.google.com/issues/37133265

  1. Эта проблема была помечена как исправленная в google Issueracker в Support Lib v 25.4.0.
  2. решение для

переместите MediaBrowserCompat.connect() из onStart () в onCreate() и переместите MediaBrowserCompat.disconnect() из onStop () в onDestroy()

работает для меня.

  1. когда я переместил их и исправил исходную проблему, появилась следующая: MediaController Callback не работал Мне кажется, что это вызвано подобной ошибкой. Итак, я переехал звонок unsubscribe() в onDestroy() тоже, и теперь все работает.

Теперь мой код выглядит так:

protected void onCreate(Bundle savedInstanceState) {
    ...    
    mediaBrowser = new MediaBrowserCompat(this, new ComponentName(this, AudioService.class),
            connCallbacks,
            null);
    mediaBrowser.connect();
    ...
}

@Override
protected void onStart() {
    super.onStart();
}

@Override
protected void onStop() {
    super.onStop();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    MediaControllerCompat cntrlr = MediaControllerCompat.getMediaController(this);
    if(cntrlr != null) {
        cntrlr.unregisterCallback(cntrlrCallback);
    }
    if(mediaBrowser.isConnected()) {
        mediaBrowser.unsubscribe(mediaBrowser.getRoot());
        mediaBrowser.disconnect();
    }
}

Со ссылкой на гугл трекер.

Проблема исправлена ​​и выпущена в 25.4.0 версии библиотеки поддержки.

Если какая-либо проблема не устранена, сообщите в систему отслеживания проблем Google, которую они снова откроют для изучения.

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