9

Sto utilizzando gli esempi dell'API Android di YouTube per creare un player YouTube chromeless nella mia app. Sto riscontrando un problema che la barra di avanzamento del buffering/caricamento continua a visualizzare sul mio video anche dopo che è stata caricata e avviata. Posso riprodurre questo nel campione FragmentDemoActivity con un paio di piccole modifiche:API Android YouTube: YouTubePlayerFragment caricamento spinner

public class FragmentDemoActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragments_demo); 

     YouTubePlayerFragment youTubePlayerFragment = 
      (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment); 
     youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, this); 
    } 

    @Override 
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, 
      boolean wasRestored) { 
     if (!wasRestored) { 
      player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS); 
      player.loadVideo("nCgQDjiotG0", 10); 
     } 
    } 

    @Override 
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {} 

} 

ho cambiato FragmentDemoActivity di ereditare da AppCompatActivity invece di YouTubeFailureRecoveryActivity, come la documentazione dice è bene fare. Ho anche cambiato lo stile del lettore per essere chromeless in onInitializationSuccess. Infine, ho modificato cueVideo in loadVideo, solo per attivare la riproduzione automatica.

Ciò si verifica su più dispositivi, incluso Nexus 5X. Sto usando la versione 1.2.2 della biblioteca. Nessun errore è attivato in onInitializationFailure.

Il video inizia la riproduzione dopo il buffering. Il giocatore è senza cromia. Tuttavia lo spinner buffer non scompare mai. È un bug o sto facendo qualcosa che non posso fare?

+1

Questo sembra essere un duplicato di http://stackoverflow.com/questions/35202945/youtubeapi-loader-doesnt-disppear, ma si spera che con un bit di codice riproducibile con cui lavorare. –

risposta

10

Ho riscontrato anche questo, sembra davvero un bug. Ecco come sono riuscito a risolvere il problema.

Nella tua onInitializationSuccess, impostare un PlaybackEventListener sul player. Eseguire l'override del onBuffering e fare qualcosa del genere:

ViewGroup ytView = (ViewGroup)ytPlayerFragment.getView(); 
ProgressBar progressBar; 
try { 
    // As of 2016-02-16, the ProgressBar is at position 0 -> 3 -> 2 in the view tree of the Youtube Player Fragment 
    ViewGroup child1 = (ViewGroup)ytView.getChildAt(0); 
    ViewGroup child2 = (ViewGroup)child1.getChildAt(3); 
    progressBar = (ProgressBar)child2.getChildAt(2); 
} catch (Throwable t) { 
    // As its position may change, we fallback to looking for it 
    progressBar = findProgressBar(ytView); 
    // TODO I recommend reporting this problem so that you can update the code in the try branch: direct access is more efficient than searching for it 
} 

int visibility = isBuffering ? View.VISIBLE : View.INVISIBLE; 
if (progressBar != null) { 
    progressBar.setVisibility(visibility); 
    // Note that you could store the ProgressBar instance somewhere from here, and use that later instead of accessing it again. 
} 

Il metodo findProgressBar, utilizzato come ripiego nel caso in cui le modifiche al codice di YouTube:

private ProgressBar findProgressBar(View view) { 
    if (view instanceof ProgressBar) { 
     return (ProgressBar)view; 
    } else if (view instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup)view; 
     for (int i = 0; i < viewGroup.getChildCount(); i++) { 
      ProgressBar res = findProgressBar(viewGroup.getChildAt(i)); 
      if (res != null) return res; 
     } 
    } 
    return null; 
} 

Questa soluzione funziona perfettamente bene per me, permettendo al ProgressBar quando il giocatore sta effettuando il buffering e disabilitandolo quando non lo è.

EDIT: Se qualcuno utilizza questa soluzione scopre che questo bug è stato corretto o che la posizione del ProgressBar è cambiato, si prega di condividere in modo che possa modificare la mia risposta, grazie!

+1

Sì! Questa soluzione alternativa fa per me il trucco: userò fino a quando non risolveranno il bug. Molte grazie! – danwilkie