从活动 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)的onConnected
后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 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:从 GLSurfaceView 返回主要活动