我在自定义MediaRouteChooser/MediaRouteController对话框时遇到问题(我需要不同的布局,一些额外的操作(。
投射按钮是通过调用来设置的CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu, R.id.media_route_menu_item);
onCreateOptionsMenu
里面。
我发现我需要扩展MediaRouteDialogFactory
,在返回自己的MediaRouteChooserDialogFragment
覆盖onCreateChooserDialog
并返回自定义对话框。然而,这需要是一个MediaRouteChooserDialog
但扩展它没有多大意义(你需要复制所有代码,因为一切都是私有的,你不能使用它们,例如mRouter
,mCallback
(。
我的问题是,我该怎么做并显示我自己的对话框和列出自己的路线,同时将CastButtonFactory.setUpMediaRouteButton
解决方案保留在onCreateOptionsMenu
内?我真的不想打扰chromecast按钮状态,如可见性,连接状态,决定是否需要显示路线选择器或路线控制器等。我什至不确定我应该如何进行路由列表/管理发现,所以在这个主题上也有一些帮助会很好。
我已经自己解决了这个问题,它对我来说效果很好。简而言之,这是我所做的,也许它提供了一些想法。
我创建了一个扩展MediaRouteDialogFactory
的CustomMediaRouteDialogFactory
,并通过覆盖onCreateChooserDialogFragment
和onCreateControllerDialogFragment
来提供我自己的对话框。这些对话框扩展了框架中的原始选择器和控制器对话框。
工具栏内投射按钮的状态仍然是自动管理的,我只是将自己的路由选择器和对话框工厂传递给了提供者。
onCreateOptionsMenu:
MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem);
mediaRouteActionProvider.setRouteSelector(chromecastManager.getMediaRouteSelector());
mediaRouteActionProvider.setDialogFactory(mediaRouteDialogFactory);
缺点: 我最终通过查看框架的选择器对话框实现的源代码和其他一些依赖项来编写自己的路由发现和筛选代码。其次,控制器对话框直接与远程媒体客户端通信。
这样我就可以完全定制,但需要一些额外的工作。