【问题标题】:Why my MediaRouteButton not available to find any cast devices?为什么我的 MediaRouteButton 无法找到任何投射设备?
【发布时间】:2014-03-25 02:12:40
【问题描述】:

以下是我在主要活动中的代码

public class MainActivity extends ActionBarActivity{
private MediaRouteButton mMediaRouteButton;
private MediaRouteSelector mMediaRouteSelector;
private MediaRouter mMediaRouter;
private CastDevice mSelectedDevice;
private MyMediaRouterCallback mMediaRouterCallback;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(this.checkGooglePlaySevices(this))
        Log.v("cc5zhenhua","googleplayservice okay");
    else
    {
        Log.v("cc5zhenhua","googleplayservice not ok");
        //GooglePlayServicesUtil.getErrorDialog(0, this, 0).show();
    }
    //initialize media cast objects
     mMediaRouter=MediaRouter.getInstance(getApplicationContext());      
     mMediaRouteSelector=new MediaRouteSelector.Builder()
     .addControlCategory(CastMediaControlIntent.CATEGORY_CAST).build();      
     mMediaRouterCallback= new MyMediaRouterCallback();
     mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback);    
}

public void onStart() {
    super.onStart();
    mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback
            );
    MediaRouter.RouteInfo route = mMediaRouter.updateSelectedRoute(mMediaRouteSelector);
    // do something with the route...
}
@Override
protected void onResume()
{
    super.onResume();
    mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    super.onCreateOptionsMenu(menu);

    //mMediaRouteButton.setRouteSelector(mMediaRouteSelector);
    return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.main, menu);
    MenuItem mediaRouteItem = menu.findItem( R.id.action_mediaroute01 );
    MediaRouteActionProvider mediaRouteActionProvider =
            (MediaRouteActionProvider)MenuItemCompat.getActionProvider(
                    mediaRouteItem);
    mediaRouteActionProvider.setRouteSelector(mMediaRouteSelector);
    mMediaRouteButton = (MediaRouteButton) mediaRouteItem.getActionView();
    return true;}

 public  boolean checkGooglePlaySevices(final Activity activity) {
        final int googlePlayServicesCheck = GooglePlayServicesUtil.isGooglePlayServicesAvailable(
                activity);
        switch (googlePlayServicesCheck) {
            case ConnectionResult.SUCCESS:
                return true;
            default:
               Log.v("cc5zhenhua","test");          }
        return false;
 }
private class MyMediaRouterCallback extends MediaRouter.Callback 
{
  @Override
  public void onRouteSelected(MediaRouter router, RouteInfo info) {
    mSelectedDevice = CastDevice.getFromBundle(info.getExtras());
    String routeId = info.getId();
    Log.v("cc5zhenhua", "MainActivity.onRouteSelected");        
  }
  @Override
  public void onRouteUnselected(MediaRouter router, RouteInfo info) {
    //teardown();
    mSelectedDevice = null;
  }
}

}

没有构建错误。但是,当我运行主要活动时,根本无法单击媒体路由按钮。请告知我错过的任何地方?谢谢!

在新 SDK 发布之前,我的 chromecast 已通过 APPID 注册到白名单中。 我也不能将该 appID 用于控件类别,它会引发 not valida appID 异常。

我的投射设备也可用于我电脑中的 chromecast 扩展。

【问题讨论】:

    标签: google-cast chromecast


    【解决方案1】:

    终于找到问题点了。只是因为我最后一个使用旧 googlecast sdk 的应用程序在 AVD 上运行,所以我专注于我的代码和新的 SDK 设置。但是,当我在真机上部署应用程序时,可以找到媒体路由。感谢 Ali 的善意和帮助。

    【讨论】:

      【解决方案2】:

      您需要通过添加回调来开始扫描:

      mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);

      如果您已经这样做了,但忘记在帖子中提及,那么您需要在开发者控制台上注册您的应用和设备。那么,您的问题很可能是由于您的设备被列入白名单;尝试从http://<chromecast-ip>:9222 的 chrome 浏览器连接到您的设备,如果不能,则您的设备未列入白名单;按照post 中的步骤进行故障排除

      【讨论】:

      • 谢谢。我有一个问题: mMediaRouter 和 mMediaRouteButton 似乎不相关,即使我向 mMediaRouter 添加回调,如何使 mMediaRouteButton 可用?我是否错过了与 mMediaRouteButton 相关的 mMediaRouter 的任何配置?
      • MediaRouter 和 MediaRouterButton 在内部是相关的,因为按钮的行为由 MediaRouter 框架管理。一般来说,最简单的方法是使用 MediaRouteActionProvider。如果可以使用,建议这样做;在我们的 github 存储库中有许多使用它的示例。如前所述,添加回调会启动(mDNS)对投射设备的扫描并使用您的选择器标准,它会尝试找到如果您单击投射按钮就会显示的可用候选者,无论您采用两种方法中的哪一种.
      • 我创建:私有类 MyMediaRouterCallback 扩展 MediaRouter.Callback ......并添加了回调,但按钮仍然不可用。还有其他可能吗? mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
      • Hi Ali Naddaf, I got following text about the MediaRouteButton in android documents."When the default route is selected or when the currently selected route does not match the selector, the button will appear in an inactive state 。”是否有可能自动选择了默认路由?
      • 如果没有可用的路线,则不应显示该按钮。如果有可用的路线但您没有选择任何路线,则表示已选择默认路线并且按钮显示为非活动状态。正如我之前建议的那样,如果可以,请使用 MediaRouteActionProvider。如果没有,我建议您从 github 示例之一开始,然后从那里开始;如果无法访问您的代码,就很难看到发生了什么。
      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2014-12-28
      • 2019-10-02
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多