过滤或隐藏可用的 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());
一种方法如下:
- 扩展
MediaRouteDialogFactory
并将 onCreateChooserDialogFragment()
覆盖为 return 您自己的选择器对话框片段,比如 'MyChooserDialogFragment';这应该扩展 MediaRouteChooserDialogFactory。
- 在
MyChooserDialogFragment
中,将 onCreateChooserDialog()
覆盖为 return,例如 MyChooserDialog
扩展了 MediaRouteChooserDialog
在 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;
我正在开发一个使用 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());
一种方法如下:
- 扩展
MediaRouteDialogFactory
并将onCreateChooserDialogFragment()
覆盖为 return 您自己的选择器对话框片段,比如 'MyChooserDialogFragment';这应该扩展 MediaRouteChooserDialogFactory。 - 在
MyChooserDialogFragment
中,将onCreateChooserDialog()
覆盖为 return,例如MyChooserDialog
扩展了MediaRouteChooserDialog
在
MyChooserDialog
中,覆盖onFilterRoute(MediaRouter.RouteInfo route))
。在此覆盖中,您被传递给一条路线,您可以 returntrue
接受或false
拒绝该路线;所以一个天真的实现是return route.getName().startsWith('room10')
(实际上,它应该更聪明一点,比如:String validPrefix = 'room10'; boolean validRoute = route.getName().startsWith(validPrefix); return !route.isDefault() && route.matchesSelector(getRouteSelector()) && validRoute;