【问题标题】:How to initialize CastContext outside of onCreate method如何在 onCreate 方法之外初始化 CastContext
【发布时间】:2016-12-08 10:21:58
【问题描述】:

由于某些条件,我只想激活 Cast 功能,因此我不想在我的 onCreate 中使用任何 Cast 逻辑。我有一个 setupCast 方法,它具有以下代码:

private void setupCast(String appId) {
    if (appId != null) {
        Log.d(TAG, "Setting up Cast...");
        setupCastListener();
        CastOptionsProvider.setAppId(appId);
        mCastContext = CastContext.getSharedInstance(_movieActivityContext);
        mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this,      _savedInstanceState);
        mCastSession = mCastContext.getSessionManager().getCurrentCastSession();
        mCastContext.getSessionManager().addSessionManagerListener(
                mSessionManagerListener, CastSession.class);
        mediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), _menuForChromecastButton, R.id.media_route_menu_item);
    }
}

应用程序接收者 ID 通过 http 调用传入,如果 appId 为空,则不启动 Cast。我遇到的问题是,以这种方式初始化 mCastContext 时,我的 Cast 按钮没有出现。

但是,如果我只移动:

mCastContext = CastContext.getSharedInstance(_movieActivityContext);

进入我的 onCreate 方法并保持其他所有内容不变,Cast 按钮就会显示出来。

【问题讨论】:

    标签: java android casting chromecast google-cast


    【解决方案1】:

    您可以使用onStart(android.content.Intent, int, int)。每次客户端通过调用 startService(Intent) 显式启动服务时由系统调用,提供它提供的参数和表示启动请求的唯一整数令牌。不要直接调用这个方法。

    // This is the old onStart method that will be called on the pre-2.0
    // platform. On 2.0 or later we override onStartCommand() so this
    // method will not be called.
    @Override
    public void onStart(Intent intent, int startId) {
    handleCommand(intent);
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    handleCommand(intent);
    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
    }
    

    请注意,系统会在您服务的主线程上调用它。服务的主线程与在同一进程中运行的活动发生 UI 操作的线程相同。您应该始终避免停止主线程的事件循环。在进行长时间运行的操作、网络调用或繁重的磁盘 I/O 时,您应该启动一个新线程或使用AsyncTask

    要正确初始化CastContext,应用程序必须有一个实现 OptionsProvider 接口的类:

    package com.example.app;
    
    public class CastOptionsProvider implements OptionsProvider {
    @Override
    public CastOptions getCastOptions(Context appContext) {
    ...
    }
    }
    

    并在 AndroidManifest.xml 中使用键 OPTIONS_PROVIDER_CLASS_NAME_KEY 指定其完全限定的类名

    ..
    
    ...
    <meta-data
    android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
    android:value="com.example.app.CastOptionsProvider" />
    ...
    

    所有公共方法都必须从主线程调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多