chromecast 发件人示例中的 Android 空指针

Posted

技术标签:

【中文标题】chromecast 发件人示例中的 Android 空指针【英文标题】:Android nullpointer in chromecast sender sample 【发布时间】:2014-08-13 19:13:10 【问题描述】:

我已经在https://developers.google.com/cast/docs/android_sender?hl=ko 完成了 chromecast 发件人应用程序的基本设置中的所有步骤

我的 onCreateOptions 菜单中不断有一个空指针:

MediaRouteActionProvider mediaRouteActionProvider = 
            (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem);
            mediaRouteActionProvider.setRouteSelector(this.mediaRouteSelector);

当我调试并单步执行时,我可以看到菜单项中的 mActionProvider 为空。

但是我使用

设置菜单,就像在示例中一样
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
>
<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    android:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
    android:showAsAction="always"/>
<item

这是我在 oncreate 中对媒体路由器的实例化

mMediaRouter = MediaRouter.getInstance(getApplicationContext());
                mediaRouteSelector = new MediaRouteSelector.Builder()
                    .addControlCategory(CastMediaControlIntent.categoryForCast(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID))
                .build();

我还使用从 ActionBarActivity 扩展的活动,并且我导入了所有需要的库。我已经看到这是一个常见问题,但我还没有看到一个常见的修复方法。是否有一些新标志或我缺少的东西来让它工作?

【问题讨论】:

您的 Android 清单中是否有 Google Play 服务依赖项: 大声笑我的源代码管理一定已经从我的清单中删除了它,因为我只是看了一下,它不在那里。我现在正在重建。 那没有帮助。我已将其添加到清单中,但我仍然在 setRouteSelector 上获得空指针 如果它是 NPE,您应该能够追踪它并查看什么是 null 并修复您的代码。您还可以查看我们在 GitHub 上的 Android 示例,了解他们是如何做到的;文档中的代码 sn-ps 只是 sn-ps,它们可能缺少一些必需的支持代码 @AliNaddaf 我终于让它工作了。我所要做的就是添加一个 MediaRouter.Callback。此外,我只是对我的 mediaRouteActionProvider 进行空检查,如果它为空,我会使用当前上下文动态创建一个新的,然后使用 MenuItemCompat 将新操作设置为菜单项。这样一来,无论我做什么,我都不会有一个 null menuitem.mActionProvider 导致我成为 npe。 【参考方案1】:

对于任何查找与我在这里得到的类似 npe 的人来说,这是解决我问题的解决方案。我在这里遇到了一个空指针:

MediaRouteActionProvider mediaRouteActionProvider = 
(MediaRouteActionProvider)  MenuItemCompat.getActionProvider(mediaRouteMenuItem);

当我进行一些调试时,我可以看到,即使我的所有设置都是正确的,但由于某种原因,在我的项目中,某些原因导致 menuitem 的操作提供程序始终为空。对我有用的解决方案是即时设置一个,然后我最终能够使用以下代码显示设备弹出窗口。

MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
MediaRouteActionProvider mediaRouteActionProvider = 
(MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem);

if(mediaRouteActionProvider==null)

   mediaRouteActionProvider  = new  MediaRouteActionProvider(this);
   MenuItemCompat.setActionProvider(mediaRouteMenuItem, mediaRouteActionProvider);



mediaRouteActionProvider.setRouteSelector(this.mediaRouteSelector);
mediaRouteActionProvider.setDialogFactory(new MediaRouteDialogFactory() 
    @Override
    public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() 

           return new MediaRouteControllerDialogFragment() 

                   @Override
                   public MediaRouteControllerDialog onCreateControllerDialog(
                      Context context, Bundle savedInstanceState) 

                      MediaRouteControllerDialog mControllerDialog = 
                      new MediaRouteControllerDialog(TrailerPlayer.this);
                      return mControllerDialog;

             
                        ;
                    
                );

【讨论】:

【参考方案2】:

确保您的菜单已经膨胀。如果您使用的是自定义 Super 类,请在菜单膨胀后添加 addMediaRouterButton 调用。

【讨论】:

以上是关于chromecast 发件人示例中的 Android 空指针的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 发件人应用程序进行 Chromecast 时更新电视上的搜索栏

检测我是不是是唯一连接到 Chromecast 设备的 Chromecast 发件人应用

Chromecast API 发件人 - Android 手机

更改 Chromecast 发件人上的应用 ID

单个网页上的多个 Chromecast 发件人

ChromeCast 发件人发现逻辑