2017-06-28 35 views
8

Próbuję dodać widok zawierający odtwarzacz YouTube do działania, które będzie odtwarzane po obróceniu urządzenia. Ponieważ interfejs zawiera więcej niż tylko wideo, używam YouTubePlayerFragment.Kontynuuj odtwarzanie odtwarzacza YouTube podczas obracania urządzenia z osobnymi układami orientacji

Gdy orientacja zmienia się z pionowej na poziomą, system powinien użyć innego pliku układu. Ten układ zawiera również odtwarzacz YouTube jako widok, który nie zajmuje całego ekranu. Poniżej znajdziesz minimalny kod do odtworzenia problemu (w przypadku nowej aplikacji na Androida, minimalna wersja interfejsu 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) { 

    } 
} 

Oto plik układ:

<?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> 

wiem Twórcy API YouTubePlayer polecić obsługi zmienia orientację ręcznie. Jest to również zaakceptowana odpowiedź w How to retain instance of fragment of fragment playing video after change in orientation?. Niestety, to nie zadziała, ponieważ istnieje zbyt wiele złożonych różnic między układami widoku pionowego i widoku poziomego.

Dokumentacja wskazuje na sposób, aby rozwiązać ten problem tak, że boolean wasRestored w metodzie zwrotnej onInitializationSuccess jest true, ale to jest rzeczywisty problem: wasRestored w kodzie powyżej jest zawszefalse.

Podsumowanie: jak utrzymać odtwarzacz YouTube w dalszym ciągu przy zmianie orientacji, zachowując przy tym osobne układy na orientację (co jest główną różnicą w przypadku powiązanych pytań)?

+1

Szukasz konkretnego rozwiązania wykorzystującego YoutubePlayerFragment? Zrobiłem coś podobnego przy użyciu YoutubeBaseActivity, jeśli jesteś zainteresowany. Używam układu liniowego, który zmienia orientację z poziomej na pionową, w zależności od orientacji. Film wideo jest odtwarzany w miarę zmiany orientacji (a także po przejściu do trybu pełnoekranowego). Myślę, że wziąłem podstawowy pomysł z przykładowego kodu, a następnie po prostu go uruchomiłem. Może https://developers.google.com/youtube/android/player/sample-applications może dać ci kilka pomysłów, jeśli jeszcze na nie nie spojrzysz. –

+1

Używam 'YouTubePlayerFragment', ponieważ odtwarzacz jest małą częścią interfejsu użytkownika. Co więcej, 'YouTubeBaseActivity' usuwa pasek akcji z interfejsu użytkownika wraz z innymi zmianami w układzie. Już sprawdziłem przykładowe aplikacje, o których wspomniałeś, ale te, które mają funkcję wizualną, którą chcę zmienić, zmieniają się ręcznie. Więc niestety to nie jest opcja. – Sandy

Odpowiedz

1

onInitializationSuccess zwraca obiekt YoutubePlayer, który ma funkcję na getCurrentTimeMillis(). Zapisz ten obiekt jako instancję działania (this.player = youTubePlayer) wewnątrz onInitializationSuccess. Zanim aktywność zostanie zniszczona (oPause/onStop), pobierz aktualny czas i przejdź do zatrzymanego fragmentu do zapisania.

+1

Technicznie to zadziała, ale nie jest to dopuszczalne rozwiązanie: ponieważ film zostanie ponownie załadowany zamiast przywrócone, może spowodować ponowne rozpoczęcie odtwarzania reklam w YouTube. – Sandy

+0

Ahhh, to może być problem – bubunyo