Продолжить воспроизведение проигрывателя YouTube во время вращения устройства с раздельными макетами ориентации

Я пытаюсь добавить View, содержащий YouTube Player, к Activity, который продолжает играть, когда я поворачиваю устройство. Поскольку пользовательский интерфейс содержит больше, чем просто видео, я использую YouTubePlayerFragment .

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

 package com.example.youtubefragmenttest; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.google.android.youtube.player.YouTubeInitializationResult; import com.google.android.youtube.player.YouTubePlayer; import com.google.android.youtube.player.YouTubePlayerFragment; public class MainActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener { private static final String YOUTUBE_DEV_KEY = "[your youtube dev key here]"; private static final String TAG_YOUTUBE_FRAGMENT = "YoutubePlayerFragment"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getFragmentManager(); YouTubePlayerFragment retainedYoutubeFragment = (YouTubePlayerFragment) fm.findFragmentByTag(TAG_YOUTUBE_FRAGMENT); if (retainedYoutubeFragment == null) { retainedYoutubeFragment = YouTubePlayerFragment.newInstance(); retainedYoutubeFragment.setRetainInstance(true); FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.add(R.id.youtube_fragment, retainedYoutubeFragment, TAG_YOUTUBE_FRAGMENT); fragmentTransaction.commit(); } retainedYoutubeFragment.initialize(YOUTUBE_DEV_KEY, this); } @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) { if (!wasRestored) { youTubePlayer.cueVideo("um4TrbU2Eic"); } } @Override public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { } } 

Вот файл макета:

 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.youtubefragmenttest.MainActivity"> <FrameLayout android:id="@+id/youtube_fragment" android:layout_width="200dp" android:layout_height="200dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toRightOf="parent" /> </android.support.constraint.ConstraintLayout> 

Я знаю, что разработчики API YouTubePlayer рекомендуют вручную изменять ориентацию. Это также принятый ответ в разделе Как сохранить экземпляр фрагмента фрагмента, воспроизводящего видео после изменения ориентации? , К сожалению, это не сработает для меня, потому что слишком много сложных различий между макетами портретного вида и пейзажного вида.

Документация boolean wasRestored как исправить это, так что boolean wasRestored в методе обратного вызова onInitializationSuccess является true , но это актуальная проблема: wasRestored в коде выше всегда false .

Итог: как вы продолжаете играть на YouTube при воспроизведении ориентации, сохраняя отдельные макеты для каждой ориентации (что является основным отличием от связанного вопроса)?

Solutions Collecting From Web of "Продолжить воспроизведение проигрывателя YouTube во время вращения устройства с раздельными макетами ориентации"

onInitializationSuccess возвращает объект YoutubePlayer который имеет функцию getCurrentTimeMillis() . Сохраните этот объект как экземпляр действия ( this.player = youTubePlayer ) внутри onInitializationSuccess . Перед тем, как действие будет уничтожено ( oPause/onStop ), получите текущее время и пароль, чтобы сохранить сохраненный фрагмент.