【问题标题】:Android chromecast: how to detect cast state on app start, before the app has been backgrounded?Android chromecast:如何在应用程序后台运行之前检测应用程序启动时的投射状态?
【发布时间】:2020-06-24 02:04:51
【问题描述】:

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

我当前的代码可以正常工作,只是它在一种特定情况下错误地检测到强制转换状态:

  1. 有可用的投射设备,并且应用程序已关闭(不在 背景)。
  2. 用户打开应用程序。
  3. 我的应用检测到的投射状态应该是 NOT_CONNECTED,但实际上是 NO_DEVICES_AVAILABLE。
  4. 等待几秒钟后,施法状态仍然错误。
  5. 将应用程序置于后台并再次将其置于前台后,投射状态正确。

我相信我的问题是由 Google Cast 的documented behavior 引起的:

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

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

【问题讨论】:

    标签: android chromecast


    【解决方案1】:

    解决了!问题是 CastHelper 在应用程序启动很久之后就被延迟初始化了。 CastHelper 仅在初始化时将自身添加为 CastStateListener,因此直到那时我们才检测到强制转换状态更改。

    为了解决这个问题,我在 CastHelper 上创建了一个无操作方法:

    CastHelper {
      ...
    
      fun onCreate() {}
    }
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多