gpt4 book ai didi

Android 支持 v7 MediaRouter 有时无法正常工作

转载 作者:可可西里 更新时间:2023-11-01 19:08:01 25 4
gpt4 key购买 nike

我使用 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 方法,但没有什么是 Google 无法解决的!由于我发现很难从文档中弄清楚这一点,因为所有内容都引用了 v7 库,下面是如何获取 MediaRouter 并选择路由。

MediaRouter mr = (MediaRouter)this.getSystemService(this.MEDIA_ROUTER_SERVICE);
mr.selectRoute(mr.ROUTE_TYPE_LIVE_AUDIO, mr.getRouteAt(0));

希望这对某人有帮助!

关于Android 支持 v7 MediaRouter 有时无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com