Android chromecast: как определить состояние приведения при запуске приложения, до того как приложение было установлено в фоновом режиме? - PullRequest
0 голосов
/ 12 марта 2020

Я добавляю поддержку Chromecast в существующее приложение Android. Мое приложение должно определить состояние приведения и соответственно изменить часть его отображения.

Мой текущий код работает, за исключением того, что он неправильно определяет состояние приведения в одном указанном c случае:

  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.

Как мое приложение может обнаружить состояние приведения, даже если оно не было задокументировано? Если нет способа сделать это, то невозможно ли преобразование из какого-либо приложения до тех пор, пока оно не станет фоновым?

1 Ответ

0 голосов
/ 18 марта 2020

Решено! Проблема заключалась в том, что CastHelper инициализировался лениво, задолго до запуска приложения. CastHelper только добавляет себя в качестве CastStateListener при инициализации, поэтому до этого момента мы не обнаруживали изменений состояния приведения.

Чтобы исправить это, я создал неактивный метод на CastHelper:

CastHelper {
  ...

  fun onCreate() {}
}

И вызвал его в методе onCreate активности моего приложения:

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

Это заставляет CastHelper инициализируется всякий раз, когда приложение работает, и позволяет приложению правильно определять состояние приведения.

...