Chromecast发送者示例中的Android nullpointer

时间:2014-08-13 19:13:11

标签: android chromecast

我已经在https://developers.google.com/cast/docs/android_sender?hl=ko

中完成了chromecast发送者应用基本设置中的所有步骤

我在onCreateOptions菜单中不断得到一个nullpointer:

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中实例化mediarouter

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

我还使用从ActionBarActivity扩展的活动,并导入所需的所有库。我见过这是一个常见的问题,但我还没有看到一个常见的修复方法。是否有一些新的旗帜或者我想要的东西让它起作用?

2 个答案:

答案 0 :(得分:0)

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

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

当我进行一些调试时,我可以看到即使我的所有设置都是正确的,由于某些原因,在我的项目中,某些事情导致menuitem的动作提供者始终为null。我的解决方案对我来说只是设置一个,然后我终于可以使用以下代码显示设备弹出窗口。

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;

             }
                        };
                    }
                });

答案 1 :(得分:0)

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