繁体   English   中英

Android chromecast:如何在应用程序进入后台之前检测应用程序启动时的投射状态?

[英]Android chromecast: how to detect cast state on app start, before the app has been backgrounded?

我正在向现有的 Android 应用程序添加 Chromecast 支持。 我的应用程序应该检测投射状态并相应地更改其显示的一部分。

我当前的代码有效,除了它在一种特定情况下错误地检测到转换状态:

  1. 投射设备可用,并且应用程序已关闭(不在后台)。
  2. 用户打开应用程序。
  3. 我的应用程序检测到的转换状态应该是 NOT_CONNECTED,但它实际上是 NO_DEVICES_AVAILABLE。
  4. 等了几秒后,施法状态还是错误。
  5. 将应用程序后台化并再次前台化后,转换状态是正确的。

我相信我的问题是由 Google Cast 的记录行为引起的:

CastContext 内部持有对 MediaRouter 的引用,当发送方应用进入前台时将启动发现过程,并在发送方应用进入后台时停止。

在启动时,我注册了一个演员状态监听器,我还检查了演员状态:

CastHelper {
  private val context: CastContext = CastContext.getSharedInstance(activity).apply {
    addCastStateListener(this@CastHelper)
  }

  val castState = context.castState

  override fun onCastStateChanged(p0: Int) {
    println("cast state change detected: new state is $castState") 
    // ^ this prints correctly, except during steps 2-4 when it never prints at all
  }
}

我想可能是演员状态侦听器有问题,所以我尝试每秒手动检查演员状态。 没有改变; castState仍然NO_DEVICES_AVAILABLE时应该NOT_CONNECTED

即使我的应用程序没有被后台处理,我的应用程序如何才能检测到转换状态? 如果没有办法做到这一点,那么在应用程序被后台处理之前,从任何应用程序进行投射是不可能的吗?

解决了! 问题是 CastHelper 在应用程序启动后很长时间才被延迟初始化。 CastHelper 仅在初始化时将自身添加为 CastStateListener,因此在那之前我们没有检测到转换状态的变化。

为了修复它,我在 CastHelper 上创建了一个 no-op 方法:

CastHelper {
  ...

  fun onCreate() {}
}

并在我的应用活动的 onCreate 方法中调用它:

class AppActivity : FragmentActivity() {
  public override fun onCreate(savedInstanceState: Bundle?) {
    ...
    CastHelper.onCreate()
}

这会强制在应用程序运行时初始化 CastHelper,并允许应用程序正确检测转换状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM