过滤或隐藏可用的 ChromeCast 设备

Filtering Or Hiding Available ChromeCast Devices

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

我曾尝试在该级别获取 MediaRouteDialogFactory 和过滤设备,但没有成功。我似乎找不到任何隐藏或删除路由的机制。

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

public boolean onFilterRoute (MediaRouter.RouteInfo route)
Returns true if the route should be included in the list.

The default implementation returns true for enabled non-default routes that match the selector. Subclasses can override this method to filter routes differently.

您需要创建一个 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());

一种方法如下:

  1. 扩展 MediaRouteDialogFactory 并将 onCreateChooserDialogFragment() 覆盖为 return 您自己的选择器对话框片段,比如 'MyChooserDialogFragment';这应该扩展 MediaRouteChooserDialogFactory。
  2. MyChooserDialogFragment 中,将 onCreateChooserDialog() 覆盖为 return,例如 MyChooserDialog 扩展了 MediaRouteChooserDialog
  3. MyChooserDialog 中,覆盖 onFilterRoute(MediaRouter.RouteInfo route))。在此覆盖中,您被传递给一条路线,您可以 return true 接受或 false 拒绝该路线;所以一个天真的实现是 return route.getName().startsWith('room10') (实际上,它应该更聪明一点,比如:

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