从活动 2(6.0.1 Android)返回活动 1 后,MediaBrowser.subscribe 不起作用

Posted

技术标签:

【中文标题】从活动 2(6.0.1 Android)返回活动 1 后,MediaBrowser.subscribe 不起作用【英文标题】:MediaBrowser.subscribe doesn't work after I get back to activity 1 from activity 2 (6.0.1 Android) 【发布时间】:2017-04-02 15:04:45 【问题描述】:

当我打开包含 MediaBrowser 连接的活动 1(应用程序的主/启动器活动)时,MediaBrowser.subscribe 工作正常(在它之后调用onChildrenLoaded),但是当我打开其他一些活动时(编号 2)从活动 1(使用按钮单击侦听器和意图)然后关闭此活动 2,MediaBrowser.subscribe 停止工作 - 订阅后不会调用 onChildrenLoaded,因此在活动 2 完成订阅回调(活动 1)的onConnectedmMediaBrowser.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 Bugs 上发现了这个问题(一些开发者报告了它):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

mb这个链接的最后评论也会为我解决这个问题

更新 3

是的,github.com/googlesamples/android-UniversalMusicPlayer/issues/92#issuecomment-287668132 解决了问题:

将 MediaBrowserCompat.connect() 从 onStart() 移动到 onCreate(),并且 将 MediaBrowserCompat.disconnect() 从 onStop() 移动到 onDestroy()。它 现在可以使用了。

【问题讨论】:

您使用的是什么版本的支持库?你能在最新的(25.3.1)上重现这个吗? @ianhanniballake 是的,我用的是最新的 如果你有一个超小的示例项目来演示这个问题,你能把它附加到你链接到的错误上吗? 【参考方案1】:
    这个问题被标记为fixed at google issuetracker in Support Lib v 25.4.0 解决方案

将 MediaBrowserCompat.connect() 从 onStart() 移动到 onCreate(),并且 将 MediaBrowserCompat.disconnect() 从 onStop() 移动到 onDestroy()

为我工作。

    当我移动它们并修复原始问题时,下一个出现了: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();
    

【讨论】:

【参考方案2】:

临时解决方案:

将 MediaBrowserCompat.connect() 从 onStart() 移动到 onCreate(),并且 将 MediaBrowserCompat.disconnect() 从 onStop() 移动到 onDestroy()。它 现在可以使用了。

必须在 v25.4.0 中修复: https://issuetracker.google.com/issues/37133265#comment3

【讨论】:

【参考方案3】:

参考Google issue tracker。

问题已在25.4.0 版本的支持库中修复并发布。

如果任何问题仍然存在,请通过Google issue tracker 报告,他们将重新打开进行检查。

【讨论】:

以上是关于从活动 2(6.0.1 Android)返回活动 1 后,MediaBrowser.subscribe 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从android中的另一个活动返回时刷新活动内容

android 从 AIDL 绑定服务返回“活动”对象

使后退按钮从活动返回到Android中的片段

Android:从 GLSurfaceView 返回主要活动

Android8.0 Intent向下一个活动传递数据返回数据给上一个活动

Android:从片段调用时如何从活动中获取返回结果?