过滤或隐藏可用的 ChromeCast 设备

Posted

技术标签:

【中文标题】过滤或隐藏可用的 ChromeCast 设备【英文标题】:Filtering Or Hiding Available ChromeCast Devices 【发布时间】:2015-06-02 14:55:45 【问题描述】:

我正在使用 Chromecast 开发一个应用,我希望能够根据设备名称或描述过滤可用的设备或路由。因此,当用户单击 MediaRouteButton 时,只会显示一些可用设备。我的应用程序的用例发生在有许多投射设备可用的地方,我想确保用户不会意外选择另一个房间中的设备。应用程序中的用户信息存储用户所在的房间信息,并且 chromecast 以智能方式命名,因此理想情况下,只有特定用户房间的 chromecast 设备才会显示为可供他们使用。

我已尝试获取MediaRouteDialogFactory 并在该级别过滤设备,但没有运气。我似乎找不到任何机制来隐藏或删除路线。

【问题讨论】:

我相信您会使用MediaRouterSelecter 来控制可见路线。不过,我不确定您是否可以按设备名称进行过滤。 【参考方案1】:

要从选择器对话框中过滤 Chromecast 设备,您可以使用 onFilterRoute:

公共布尔 onFilterRoute(MediaRouter.RouteInfo 路由) 如果路由应该包含在列表中,则返回 true。

默认实现为启用的非默认路由返回 true 匹配选择器。子类可以重写这个方法来过滤 路线不同。

你需要创建一个CustomMediaRouteChooserDialog:

public class CustomMediaRouteChooserDialog extends MediaRouteChooserDialog 
    public CustomMediaRouteChooserDialog(Context context) 
        super(context);
    

    public CustomMediaRouteChooserDialog(Context context, int theme) 
        super(context, theme);
    

    @Override
    public boolean onFilterRoute(MediaRouter.RouteInfo route) 
        // Apply your logic here.
        // Return false to hide the device, true otherwise

        if (TextUtils.equals(route.getName(), "Chromecast-hidden"))
            return false;
        else
            return true;
    

然后创建一个CustomMediaRouteChooserDialogFragment:

public class CustomMediaRouteChooserDialogFragment extends MediaRouteChooserDialogFragment 

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        CustomMediaRouteChooserDialog dialog = new CustomMediaRouteChooserDialog(getActivity());
        dialog.setRouteSelector(getRouteSelector());
        return dialog;
    

然后创建一个CustomMediaRouteDialogFactory:

public class CustomMediaRouteDialogFactory extends MediaRouteDialogFactory 

    @Override
    public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() 
        return new CustomMediaRouteChooserDialogFragment();
    

然后在创建你的MediaRouteActionProvider 之后调用setDialogFactory:

mediaRouteActionProvider.setDialogFactory(new CustomMediaRouteDialogFactory());

【讨论】:

谢谢!我在运行它时遇到了问题(背景颜色上的 IllegalArgumentException),但在 @Ali naddaf 的回答 1 的帮助下。我已将 onCreateDialog 替换为 onCreateChooserDialog 2. 并使用 this answer,我已替换 @987654334 @ by CustomMediaRouteChooserDialog(context, R.style.Theme_AppCompat_NoActionBar) 现在一切正常!【参考方案2】:

一种方法如下:

    扩展MediaRouteDialogFactory 并覆盖onCreateChooserDialogFragment() 以返回您自己的选择器对话框片段,例如“MyChooserDialogFragment”;这应该扩展 MediaRouteChooserDialogFactory。 在MyChooserDialogFragment 中,覆盖onCreateChooserDialog() 以返回MyChooserDialog,它扩展了MediaRouteChooserDialog

    MyChooserDialog 中,覆盖onFilterRoute(MediaRouter.RouteInfo route))。在此覆盖中,您通过了一个路由,您可以返回 true 以接受或返回 false 以拒绝该路由;所以一个幼稚的实现是return route.getName().startsWith('room10')(实际上,它应该更聪明一点:

    String validPrefix = 'room10'; boolean validRoute = route.getName().startsWith(validPrefix); return !route.isDefault() && route.matchesSelector(getRouteSelector()) && validRoute;

【讨论】:

太好了,谢谢。我之前没能找到 onFilterRoute() 方法。

以上是关于过滤或隐藏可用的 ChromeCast 设备的主要内容,如果未能解决你的问题,请参考以下文章

Chromecast 不可用于测试

Chrome:Google Cast 检索可用设备列表

铸造设备开发

chromecast 是不是停留在 chrome 版本 31

隐藏故事书“新版本可用”弹出窗口?

如何生成一组过滤的可用字体系列名称? (如在 Pages 或 TextEdit 中)