2016-05-04 36 views
7

Utilizzando lo YouTube Android Player API sample code (versione 1.2.2), se cambio uno degli ID video su uno che ho caricato (ad esempio "QVikru_w2hQ" o "u1n6E81rm80"), la miniatura viene caricata in il giocatore, ma al momento della riproduzione, il giocatore passa alla funzione onError con YouTubePlayer.ErrorReason.INTERNAL_ERROR. Viene visualizzato un messaggio che dice "Si è verificato un problema durante la riproduzione. Tocca per riprovare". La riproduzione di questi video sul sito web di YouTube o sulla nostra app per iOS non ha alcun problema. I video di esempio originali funzionano bene con la mia chiave sviluppatore.YouTube Android Player API INTERNAL_ERROR per più video

Sto riscontrando questo problema su più dispositivi, incluso il mio Nexus 5X (Android 6.0.1) con la versione dell'app YouTube al momento 11.13.56.

Qualcun altro ha riscontrato un problema simile?

Ho anche pubblicato un potenziale bug report su google data api issue tracker.

+0

funziona su qualsiasi dispositivo? –

+0

@VivekMishra: Galaxy S4, 5.0.1, 11.10.60 - No. HTC One M8, 6.0, 11.10.60 - No. HTC Desire 610, 4.4.2, 11.13.56 - No. Non ho trovato ancora. –

+0

Ho anche provato il codice di esempio e certamente non funziona con l'id del video che hai fornito ma funziona con molti ID video casuali che ho scelto da you tube e funziona perfettamente. Penso che possa essere correlato al problema dell'accessibilità –

risposta

0

Sembra un errore YouTube, visualizza YouTubeAndroidPlayerAPI can't play some videos per i dettagli che ho raccolto.

l'unica soluzione passabile in questo momento sembra essere aprire il video nell'app ufficiale di YouTube con un intento o sostituire il frammento del giocatore con una WebView. Ho preferito questa seconda soluzione.

Il WebView standard è molto limitato e non mostrerà il pulsante per portare il video a schermo intero. È necessario creare una classe che estende WebChromeClient:

public class MyWebChromeClient extends WebChromeClient { 

    FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); 

    @Override 
    public void onShowCustomView(View view, CustomViewCallback callback) { 
     if (mCustomView != null) { 
      callback.onCustomViewHidden(); 
      return; 
     } 
     mContentView = (LinearLayout) findViewById(R.id.scheda_video_activity); 
     mContentView.setVisibility(View.GONE); 
     mCustomViewContainer = new FrameLayout(SchedaVideoActivity.this); 
     mCustomViewContainer.setLayoutParams(LayoutParameters); 
     mCustomViewContainer.setBackgroundResource(android.R.color.black); 
     view.setLayoutParams(LayoutParameters); 
     mCustomViewContainer.addView(view); 
     mCustomView = view; 
     mCustomViewCallback = callback; 
     mCustomViewContainer.setVisibility(View.VISIBLE); 
     setContentView(mCustomViewContainer); 
    } 

    @Override 
    public void onHideCustomView() { 
     if (mCustomView == null) { 
      return; 
     } else { 
      mCustomView.setVisibility(View.GONE); 
      mCustomViewContainer.removeView(mCustomView); 
      mCustomView = null; 
      mCustomViewContainer.setVisibility(View.GONE); 
      mCustomViewCallback.onCustomViewHidden(); 
      mContentView.setVisibility(View.VISIBLE); 
      setContentView(mContentView); 
     } 
    } 
} 

e poi inizializzare il WebView:

WebView myWebView = (WebView)findViewById(R.id.webview); 
MyWebChromeClient mWebChromeClient = new MyWebChromeClient(); 
myWebView.setWebChromeClient(mWebChromeClient); 
myWebView.setWebViewClient(new WebViewClient(){ 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     return false; 
    } 
}); 
WebSettings webSettings = myWebView.getSettings(); 
webSettings.setJavaScriptEnabled(true); 

Infine, caricare il video nel WebView:

myWebView.loadUrl("https://www.youtube.com/embed/"+youtube_id); 

Se si desidera Adattare le dimensioni di WebView al lettore YouTube è possibile:

Point size = new Point(); 
getWindowManager().getDefaultDisplay().getSize(size); 
myWebView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int)Math.round(size.x/1.77))); 
+0

Hai avviato la riproduzione automatica con questo metodo? Non sono ancora riuscito a farlo. 'setMediaPlaybackRequiresUserGesture (false)' non sembra aiutare. –

+0

No, non è possibile riprodurre automaticamente i video con questo semplice codice ... l'utente deve toccare il pulsante "Riproduci". – frabbe

2

Il WebView sembra essere una buona soluzione. Perché ero di fretta e aveva bisogno di una soluzione rapida, ho usato il codice sorgente di questo progetto github:

https://github.com/theScrabi/NewPipe

Questo codice non si basa sulle API Youtube. È puro parsing web. Tutti i miei video stanno funzionando bene con la soluzione, veloce come prima.

L'intero progetto è un'app funzionale, ma è possibile immergersi e prendere ciò di cui si ha bisogno. Ho usato il frammento che incorpora la miniatura del video e l'attività del giocatore a schermo intero.

Complimenti all'autore del progetto.