我使用v7支持库MediaRouter在电话的扬声器和蓝牙设备之间切换路由。
有时它的工作方式很奇怪,例如,当我关闭蓝牙时,似乎已删除了相应的路由(播放切换到扬声器),但是我的应用程序未收到有关它的任何回调。而且,当我通过MediaRouter.getRoutes()手动获取所有路由时,它会返回该蓝牙路由,但是当我尝试切换到该蓝牙路由时,它似乎已被选中,但实际上回放仍然通过扬声器进行。
我尝试了所有标志CALLBACK_FLAG_FORCE_DISCOVERY,CALLBACK_FLAG_REQUEST_DISCOVERY等,但没有结果。只有电话重启才有帮助。有什么建议么?
我使用的是Android 4.2、4.4。
更新,代码示例:
....
private MediaRouter mMediaRouter;
private MediaRouter.Callback mMediaRouterCallback = new MediaRouter.Callback(){
@Override
public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteAdded(router, route);
refreshRoutes();
Log.i(TAG, "Route added ==> " + route.getName());
}
@Override
public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteRemoved(router, route);
refreshRoutes();
Log.i(TAG, "Route removed ==> " + route.getName());
}
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteSelected(router, route);
Log.i(TAG, "Route selected ==> " + route.getName());
refreshRoutes();
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteUnselected(router, route);
Log.i(TAG, "Route UNselected ==> " + route.getName());
refreshRoutes();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRoutesList = (ListView) findViewById(R.id.routesList);
mRoutesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String routeName = mRoutesAdapter.getItem(i);
List<MediaRouter.RouteInfo> routes = mMediaRouter.getRoutes();
for (MediaRouter.RouteInfo rout : routes){
if (rout.getName().equals(routeName)){
mMediaRouter.selectRoute(rout);
}
}
}
});
mMediaRouter = MediaRouter.getInstance(this);
mMediaRouter.addCallback(
new MediaRouteSelector.Builder()
.addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
.addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
.build(),
mMediaRouterCallback,
MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
mRoutesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 0);
mRoutesList.setAdapter(mRoutesAdapter);
refreshUi();
}
@Override
protected void onDestroy() {
mMediaRouter.removeCallback(mMediaRouterCallback);
super.onDestroy();
}
private void refreshRoutes(){
mRoutesAdapter.clear();
MediaRouter.RouteInfo selectedRoute = mMediaRouter.getSelectedRoute();
List<MediaRouter.RouteInfo> routes = mMediaRouter.getRoutes();
for (MediaRouter.RouteInfo rout : routes){
if (rout == selectedRoute)
mRoutesAdapter.add(rout.getName() + " [selected]");
else
mRoutesAdapter.add(rout.getName());
}
mRoutesAdapter.notifyDataSetChanged();
}
最佳答案
在问题注释中使用@Xaver的建议,我将所有MediaRouting都放在了服务中。我在进行服务之前一切正常,但是发生了相同的错误。当我返回 Activity 时,从有线扬声器切换到蓝牙扬声器后,尽管说当前路线是蓝牙扬声器,但MediaRouter
仍会卡在有线扬声器上。
从android.support.v7.media.MediaRouter
切换到android.media.MediaRouter
并重构我的代码,一切正常。很难说是否将路由转移到服务中是否是组合的一部分,但我能使它正常工作(经过50个小时的修补工作)android.media.MediaRouter
的不幸之处在于它没有getRoutes
方法,但是一点点Googleing无法处理!由于我发现很难从文档中找出问题,因为所有内容都引用了v7
库,因此以下是获取MediaRouter和选择路由的方法。
MediaRouter mr = (MediaRouter)this.getSystemService(this.MEDIA_ROUTER_SERVICE);
mr.selectRoute(mr.ROUTE_TYPE_LIVE_AUDIO, mr.getRouteAt(0));
希望这可以帮助某人!