过滤或隐藏可用的 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 设备的主要内容,如果未能解决你的问题,请参考以下文章