2013-02-08 26 views

risposta

48

Questo è qualcosa che ho passato l'ultimo giorno o così a strapparmi i capelli. Sulla base di vari pezzi di codice provenienti da tutto il web sono riuscito a farlo funzionare.

Innanzitutto, è necessario creare una classe personalizzata WebChromeClient, che implementa i metodi onShowCustomView e onHideCustomView.

private 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 a view already exists then immediately terminate the new one 
     if (mCustomView != null) { 
      callback.onCustomViewHidden(); 
      return; 
     } 
     mContentView = (RelativeLayout) findViewById(R.id.activity_main); 
     mContentView.setVisibility(View.GONE); 
     mCustomViewContainer = new FrameLayout(MainActivity.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 { 
      // Hide the custom view. 
      mCustomView.setVisibility(View.GONE); 
      // Remove the custom view from its container. 
      mCustomViewContainer.removeView(mCustomView); 
      mCustomView = null; 
      mCustomViewContainer.setVisibility(View.GONE); 
      mCustomViewCallback.onCustomViewHidden(); 
      // Show the content view. 
      mContentView.setVisibility(View.VISIBLE); 
      setContentView(mContentView); 
     } 
    } 
} 

In sostanza, ciò che sta accadendo qui è quando viene premuto il pulsante a schermo intero, stiamo creando una nuova vista per contenere il video e nascondere la vista principale. E poi, quando lo schermo intero è chiuso, facciamo l'opposto: sbarazzati della nuova vista e visualizzate la vista originale.

Avrai bisogno di aggiungere anche tutte quelle proprietà per la classe di attività:

private MyWebChromeClient mWebChromeClient = null; 
private View mCustomView; 
private RelativeLayout mContentView; 
private FrameLayout mCustomViewContainer; 
private WebChromeClient.CustomViewCallback mCustomViewCallback; 

E probabilmente vuole rendere chiudere il video a schermo intero quando viene premuto il pulsante indietro:

@Override 
public void onBackPressed() { 
    if (mCustomViewContainer != null) 
     mWebChromeClient.onHideCustomView(); 
    else if (myWebView.canGoBack()) 
     myWebView.goBack(); 
    else 
     super.onBackPressed(); 
} 

Poi è solo una questione di usare la vostra nuova classe quando si crea la visualizzazione web:

myWebView = (WebView) findViewById(R.id.webView1); 
mWebChromeClient = new WMWebChromeClient(); 
myWebView.setWebChromeClient(mWebChromeClient); 

Funziona per me su Android 4.x. Non sono sicuro delle versioni precedenti poiché la mia app non le ha indirizzate.

Ho trovato questi link particolarmente utili: WebView and HTML5 <video> e http://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org/itri/html5webview/HTML5WebView.java

+0

Nel codice di esempio, che cosa è mContentView nel contesto di una visione per lo schermo pieno? Immagino che sia una specie di layout che hai gonfiato, ma come hai fatto a schermo intero. Puoi pubblicare l'XML per l'oggetto mContentView? –

+0

'mContentView' è la vista attività principale, che viene nascosta quando il video viene reso a schermo intero. Comunque non sto facendo automaticamente il video a schermo intero; l'utente lo fa (se lo desidera) quando guarda il video. –

+0

@MarkParnell Dai anche i tuoi commenti anche qui http://stackoverflow.com/questions/18533678/playing-youtube-videos-smoothly-in-web-view – anshul

0

È possibile avviare un app YouTube esterno quando si Cath info video URLif non è importante mostrare video di YouTube direttamente nell'applicazione.

per catturare informazioni URL del video, è necessario owerride onLoadResource metodo:

new WebViewClient() { 

    @Override 
    public void onLoadResource(WebView view, String url) { 

     if (url.startsWith("http://www.youtube.com/get_video_info?")) { 
      try { 
       String path = url.replace("http://www.youtube.com/get_video_info?", ""); 

       String[] parqamValuePairs = path.split("&"); 

       String videoId = null; 

       for (String pair : parqamValuePairs) { 
        if (pair.startsWith("video_id")) { 
         videoId = pair.split("=")[1]; 
         break; 
        } 
       } 

       if(videoId != null){ 
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com")) 
          .setData(Uri.parse("http://www.youtube.com/watch?v=" + videoId))); 
        needRefresh = true; 

        return; 
       } 
      } catch (Exception ex) { 
      } 
     } else { 
      super.onLoadResource(view, url); 
     } 
    } 
} 
+0

Bel codice, ma quando premo sul video si inizia anche a giocare in webview, come posso annullarlo? – KiKo

+0

È possibile chiamare WebView.reload(). Ma puoi implementare video a schermo intero direttamente nell'app se non hai bisogno di avviare l'app esterna. –

+0

Come posso farlo ..? Qualche esempio di codice ... – KiKo

Problemi correlati