0

我正在尝试自动发现 Cast 设备。这基本上是我所看到的如何做到这一点的逐字记录,但是我从来没有得到 onRouteAdded 或 onRouteSelected 的回调。

我尝试更改使用哪些标志,但没有得到不同的结果。有时会添加路线,但从未选择过。

private void startSearchForDevicesAndCast() {
    MediaRouter router = MediaRouter.getInstance(this);

    int count = router.getRoutes().size();

    List<MediaRouter.RouteInfo> j = router.getRoutes();
    MediaRouteSelector selector = new MediaRouteSelector.Builder().addControlCategory(
            CastMediaControlIntent.categoryForCast(getString(R.string.app_id))).build();

    router.addCallback(selector, new MediaRouter.Callback() {
        @Override
        public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) {
            super.onRouteAdded(router, route);
            Log.i(TAG, "onRouteAdded: ");
            router.selectRoute(route);
        }

        @Override
        public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) {
            super.onRouteChanged(router, route);
            Log.i(TAG, "onRouteChanged: ");
        }

        @Override
        public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
            Log.i(TAG, "onRouteSelected: ");
            super.onRouteSelected(router, route);
        }
    }, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
}
4

1 回答 1

2

我相信你的情况,你需要做更多的事情。根据您的应用程序的设置和结构以及其他一些因素,您期望的路由可能已经被 MediaRouter 发现。在这种情况下,您将不会获得 onRouteAdded(),因为它已经存在。为了适应这种情况,一种方法是在调用之后 router.addCallback(..)(正如您已经在做的那样),通过调用获取所有当前路由的mMediaRouter.getRoutes()列表,然后过滤您感兴趣的应用程序 ID 的列表(通过使用您定义的相同选择器并使用route.matchesSelector(selector)) 并将其视为您发现的初始设备集。从那时起,onRouteAdded()onRouteRemoved()可用于更新列表。至于onRouteChanged(),有时包含有价值的信息;例如,当一个投射设备重新启动时,当它出现时,一开始它可能没有正确的配置,但在它获得配置并更新某些字段然后onRouteChanged()被调用后不久,但在大多数情况下,您可能会忽略它并只关注初始集和添加或删除的集。如果您想了解如何将其组合在一起,请注意我上面概述的内容与 MediaRouterChooserDialog 内部所做的非常接近,并且由于其源代码在 Media Router v7 支持库中公开可用,您可以查看一下如何做到这一点。

于 2016-12-03T02:38:46.827 回答