YouTubePlayerSupportFragment в однозадачном приложении с изменением ориентации

Я попытался решить эту проблему, обыскав через Интернет, никакого реального ответа не найдено.

Я разрабатываю приложение, в котором нужен плеер YouTube. Этот игрок является YouTubePlayerSupportFragment, поскольку он находится в фрагменте поддержки (поэтому он также вложен). После первоначальной настройки я понял, что всякий раз, когда я поворачиваю телефон, видео перестает играть, и его нужно снова перезапустить. Это, очевидно, не то, что я хочу.

Затем я нашел несколько ответов SO (как это), где люди говорят, что Activity необходимо обрабатывать изменения конфигурации, поэтому я добавил android:configChanges="keyboardHidden|orientation|screenSize" в Activity in манифест. Это решило проблему, теперь видео продолжает играть даже при изменении ориентации, и полноэкранное вращение не выглядит уродливым. Прохладный, я сказал, только чтобы понять, что это перепутало большое время с другими частями приложения, потому что конфигурация теперь обновляется после того, как все взгляды на месте. Это означает, что если мой телефон был в портретном режиме, и я повернул его к пейзажу, используемая компоновка по-прежнему будет портретной.

Я нашел решения для этого, предлагая вызов setContentView(...) в Activity onConfigurationChanged(...) и повторное включение представления в Фрагменты, но это кажется довольно громоздким, если не страшным решением, поскольку это не просто простая настройка содержимого, в которой я нуждаюсь, фрагменты необходимо сохранить (например, положение прокрутки в RecyclerView). Встроенный setRetainInstance(true) не работает в этом случае, поскольку представление также будет воссоздано с этим, но конфигурация по-прежнему остается старой при вызове onCreateView(...).

Было бы неплохо, если бы я мог поймать события configChanges, если пользователь только на этом экране (фрагменте), но сохранит активность в другом месте.

Не предлагайте использовать больше действий, я не могу использовать отдельное действие для этого экрана и остальное приложение из-за причин UI/UX.

Ответы

Ответ 1

В соответствии с this Правила API для Android-плееров YouTube

Рекомендуется, чтобы вы обрабатывали изменения конфигурации, вызванные ориентации в вашей деятельности вручную, чтобы избежать повторного создания этого фрагмент каждый раз при изменении конфигурации. К лучшему пользовательский интерфейс, вы также должны вручную обрабатывать полноэкранное событие путем изменения макета вашей деятельности (см. второй вариант)

Как вы уже справляетесь с изменениями конфигурации, я вижу два возможных решения вашей проблемы.

  • Установите setFullscreenControlFlags (к вашему объекту YouTubePlayer) в FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE (Это приведет к тому, что плеер автоматически войдет в полноэкранный режим всякий раз, когда устройство войдет в альбомную ориентацию.) в сочетании с FULLSCREEN_FLAG_CONTROL_ORIENTATION (Чтобы включить автоматическое управление ориентацией.).

Обратите внимание, что этот флаг должен быть установлен только в том случае, если ваша активность заблокирована портрет (и указан как таковой в манифесте).

Флаг полезен, если у вас нет ландшафтного макета для вашего деятельности, но хотел бы включить ландшафтную ориентацию исключительно для просмотр полноэкранного видео.

  1. Этот подход может решить вашу проблему, и это также предлагается официальной документацией, как я упоминал выше. В методе setFullscreenControlFlags установите FULLSCREEN_FLAG_CUSTOM_LAYOUT, который отключает обработчик полноэкранного макета по умолчанию, позволяя вам вручную управлять переходом на полноэкранный макет. Помимо возможности создания пользовательского полноэкранного макета, этот параметр также дает преимущество в том, что вы избегаете коррекции, возникающей в полноэкранном режиме по умолчанию.

Приложение, реализующее пользовательское полноэкранное поведение, должно обеспечить две вещи

То, что просмотр игрока занимает все свободное пространство при каждом вызове onFullscreen (boolean). Что активность не воссоздается, когда ориентация меняется на пейзаж. Чтобы достичь этого для деятельности, поддерживающей портрет, вы необходимо указать, что ваша активность обрабатывает некоторые изменения конфигурации самостоятельно в вашем заявлении, включая ориентацию, keyboardHidden и screenSize.

Смотрите здесь о том, как использовать этот флаг.

В соответствии с первой ссылкой , которую я поделил, этот второй подход позволит избежать воссоздания фрагментации каждый раз при изменении конфигурации. Также вам не нужно вызывать setContentView(...) в onConfigurationChanged(...).

Надеюсь, это поможет вам.