首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓支持v7 MediaRouter有时无法正常工作

安卓支持v7 MediaRouter有时无法正常工作
EN

Stack Overflow用户
提问于 2015-01-30 22:05:53
回答 1查看 1.9K关注 0票数 14

我使用v7支持库MediaRouter在电话扬声器和蓝牙设备之间切换路由。

有时它的工作方式很奇怪,例如,当我关闭蓝牙时,相应的路由似乎被移除(播放开关切换到扬声器),但我的应用程序没有收到任何有关它的回调。此外,当我通过MediaRouter.getRoutes()手动获取所有路由时,它会返回蓝牙路由,但当我尝试切换到它时,它似乎被选中了,但实际上回放仍然通过扬声器进行。

我尝试了所有的标志CALLBACK_FLAG_FORCE_DISCOVERY,CALLBACK_FLAG_REQUEST_DISCOVERY等,都没有结果。只有手机重启才有帮助。有什么建议吗?

我使用的是Android 4.2、4.4。

更新,代码示例:....

代码语言:javascript
复制
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();
    }
EN

回答 1

Stack Overflow用户

发布于 2015-06-26 04:38:02

使用@Xaver在问题评论中的建议,我将所有的MediaRouting放在一个服务中。我让一切都像服务之前一样工作,但同样的错误也在发生。当我返回活动时,在从有线扬声器切换到BlueTooth扬声器后,MediaRouter仍然卡在有线扬声器上,尽管说当前路由是蓝牙扬声器。

android.support.v7.media.MediaRouter切换到android.media.MediaRouter,并稍微重构一下代码,一切都运行得很完美。很难说将路由移动到服务是否是组合的一部分,但我让它工作了(经过大约50个小时的修补)

android.media.MediaRouter的不幸之处在于它没有getRoutes方法,但没有一点谷歌不能处理的东西!由于我发现从文档中找出这一点很痛苦,因为所有内容都引用了v7库,下面是如何获取MediaRouter并选择路由。

代码语言:javascript
复制
MediaRouter mr = (MediaRouter)this.getSystemService(this.MEDIA_ROUTER_SERVICE);
mr.selectRoute(mr.ROUTE_TYPE_LIVE_AUDIO, mr.getRouteAt(0));

希望这对某些人有帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28237622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档