Как правильно обрабатывать поворот экрана, кнопку маршрутизации мультимедиа и существующий сеанс?

Пример на https://developers.google.com/cast/cast_2nd-screen_app_tutorial показывает метод onDestroy, который вызывает unregisterMediaRouteProvider. Это приводит к вызову метода MediaRouter.Callback.onRouteUnselected, который, в свою очередь, завершает сеанс. Это приводит к тому, что приложение отключается от устройства Chromecast, а MediaRouteButton перестает быть синим. Ниже приведен метод onDestroy из примера:

@Override
protected void onDestroy() {
    MediaRouteHelper.unregisterMediaRouteProvider(mCastContext);
    mCastContext.dispose();
    super.onDestroy();
}

Итак, мой вопрос: как правильно обрабатывать поворот экрана при использовании устройства chromecast из приложения?


person casolorz    schedule 08.01.2014    source источник


Ответы (2)


Вы можете попробовать использовать метод isFinishing() для Активность, чтобы выяснить, вызывается ли onDestroy из-за того, что приложение действительно "завершает" или вызывается по другим причинам. Другой вариант — самостоятельно изменить ориентацию.

person Ali Naddaf    schedule 09.01.2014

Вы можете ознакомиться с рекомендациями по настройке/уничтожению Chromecast (например, при смене ориентации) на странице https://developers.google.com/cast/docs/android_sender

Соответствующие разделы кода следующие:

@Override
protected void onResume() {
   super.onResume();
   mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
   MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
}

@Override
protected void onPause() {
   if (isFinishing()) {
   mMediaRouter.removeCallback(mMediaRouterCallback);
   }
super.onPause();
}

А также следующий код:

@Override
protected void onStart() {
  super.onStart();
  mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
  MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
}

@Override
protected void onStop() {
   mMediaRouter.removeCallback(mMediaRouterCallback);
   super.onStop();
}

Также рекомендуется иметь логическое значение в вашей программе, например, «wasLaunched» или «isConnected», чтобы отслеживать, активно ли подключение к chromecast или нет. Я использую эту переменную в своем коде, чтобы проверить, могу ли я отправлять сообщения получателю или нет. Затем просто не забудьте сохранить эту переменную и восстановить ее при изменении ориентации устройства. Это работает для меня в моем приложении с поддержкой Chromecast. Ниже показан код для сохранения/восстановления моей переменной, чтобы она учитывала изменение ориентации:

protected void onSaveInstanceState(Bundle bundle) {     
    if (bundle!=null)
    {
        bundle.putBoolean("wasLaunched", wasLaunched);
    }
    super.onSaveInstanceState(bundle);  
}

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if (savedInstanceState!=null)
    {
        wasLaunched = savedInstanceState.getBoolean("wasLaunched");
    }
    super.onRestoreInstanceState(savedInstanceState);
};

Конечно, вы также можете поместить в свой пакет другие вещи, которые должны пережить изменение ориентации. Я не использую описанное вами переопределение onDestroy и не упоминается в документации Google, на которую я ссылаюсь. Но я использую метод teardown(), описанный в этом документе, на который я ссылаюсь, для очистки, но это происходит только тогда, когда я закрываю соединение, потому что я не хочу закрывать соединение с chromecast при изменении ориентации.

person zaifrun    schedule 21.09.2014
comment
Я думаю, что задал этот вопрос до того, как был выпущен официальный SDK, спасибо, что посмотрели его. - person casolorz; 22.09.2014
comment
Есть ли способ сохранить соединение, когда устройство переходит в режим блокировки экрана? - person Alex Semeniuk; 23.09.2015
comment
А я не думаю, что вы теряете связь с хромкастом при блокировке экрана? (По крайней мере, если вы это сделаете, тогда должно быть возможно сохранить соединение, потому что это именно то, что делает приложение Netflix, потому что оно работает и при блокировке экрана) - person zaifrun; 24.09.2015