java - 如何在 onCreate 方法之外初始化 CastContext

标签 java android casting chromecast google-cast

由于某些条件,我只想激活 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 为 null,则不启动 Cast。我遇到的问题是,以这种方式初始化 mCastContext 时,我的 Cast 按钮不会显示。

但是,如果我只移动:

mCastContext = CastContext.getSharedInstance(_movieActivityContext);

进入我的 onCreate 方法并保持其他一切不变,“Cast”按钮就会显示。

最佳答案

您可以使用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;
}

请注意,系统在服务的主线程上调用此函数。服务的主线程与同一进程中运行的 Activity 进行 UI 操作的线程相同。您应该始终避免停止主线程的事件循环。当进行长时间运行的操作、网络调用或大量磁盘 I/O 时,您应该启动一个新线程或使用 AsyncTask .

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

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" />
...

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

关于java - 如何在 onCreate 方法之外初始化 CastContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38731002/

相关文章:

c++ - 编译器如何调用运算符转换?

c++ - unique_ptr 的动态转换

java - 具有可变对象 Java 的不可变数组

java - 如何在 ClojureScript 中导入 Java 类?

Android 以画廊风格的方式滚动浏览应用内图片

java - 不同 Android 版本的 HTTP 请求错误

arrays - 为什么在使用 ReadBytesExt 从 byte slice 段中读取整数时会出现错误 "trait bounds were not satisfied"?

java - 当我使用 spring boot 运行项目时。它运行良好。但是当我将它部署到tomcat中时。我收到低于书面的异常

java - 我无法纠正的鼠标事件未知错误

android - 我们如何在 flutter_riverpod 中没有 ref 对象的情况下访问提供程序?