Chromecast:如何 select 没有 CastButton 的 CastDevice

Chromecast: how to select a CastDevice without a CastButton

我正在开发一个应用程序,我想在其中流式传输位于我的移动设备上的特定视频。我想借助 ChromeCast 将此视频流式传输到投影仪。我已经完成 Google Chromecast 教程(例如 https://codelabs.developers.google.com/codelabs/cast-videos-android/#0)并且已经在寻找我的问题的答案,但我认为没有完美的答案来解决我的问题。

其他编码语言中有一些解决方案,但不是特别适用于 java。

我的 Google 投射 API 的问题是:我想 select 我的 ChromeCast 而不是按选项菜单中的投射按钮 ,似乎 select 网络中的 ChromeCasts 之一。

这是我的代码,其中出现了 CastButton(在 OnCreateOptionsMenu-Method 中创建)(它只是连接到 ChromeCast 的代码。我没有实现 select 播放和流式传输视频的代码还):

谁能帮帮我?

代码:

public class MainActivity extends AppCompatActivity {
private CastSession mCastSession;
private CastContext mCastContext;
private SessionManager mSessionManager;

private final SessionManagerListener mSessionManagerListener = new SessionManagerListenerImpl();

private class SessionManagerListenerImpl implements SessionManagerListener{

    @Override
    public void onSessionStarting(Session session) {}

    @Override
    public void onSessionStarted(Session session, String sessionId) {
        invalidateOptionsMenu();
    }

    @Override
    public void onSessionStartFailed(Session session, int i) {}

    @Override
    public void onSessionEnding(Session session) {}

    @Override
    public void onSessionEnded(Session session, int error) {
        finish();
    }

    @Override
    public void onSessionResuming(Session session, String s) {}

    @Override
    public void onSessionResumed(Session session, boolean wasSuspended) {
        invalidateOptionsMenu();
    }

    @Override
    public void onSessionResumeFailed(Session session, int i) {}

    @Override
    public void onSessionSuspended(Session session, int i) {}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mCastContext = CastContext.getSharedInstance(this);
    mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this, savedInstanceState);
    mSessionManager = CastContext.getSharedInstance(this).getSessionManager();
}

@Override
public void onResume(){
    mCastSession = mCastContext.getSessionManager().getCurrentCastSession();
    mSessionManager.addSessionManagerListener(mSessionManagerListener);
    super.onResume();
}

@Override
public void onPause(){
    super.onPause();
    mSessionManager.removeSessionManagerListener(mSessionManagerListener);
    mCastSession = null;
}

@Override
public void onStart(){
    super.onStart();
}

@Override public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.menu, menu);
    CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
            menu,
            R.id.media_route_menu_item);
    return true;
}}

这可以通过 SDK v2. Check out the source code for MediaRouteChooserDialogFragment 实现,UI 元素允许用户 select 投射设备。您需要创建一个 MediaRouter.Callback,并覆盖 onRouteAdded(MediaRouter router, MediaRouter.RouteInfo newRoute)。如果新路由不是默认路由,select 它与 mMediaRouter.selectRoute(newRoute)。这将在没有任何用户交互的情况下将您连接到接收器设备。

这应该适用于测试,但请不要在生产应用中这样做。 @AliNaddaf 正确地指出这违反了 UX 指南和 GoogleCast 服务条款(如果允许应用程序在未经用户同意的情况下开始投射,您可以想象滥用的可能性)。