2011-08-09 17 views
9

Necesito reproducir un video html5 en línea en una WebView. Encontré una técnica que debería funcionar, pero solo funciona esporádicamente (ver el final de la pregunta). Cuando no funciona, no se llama a OnShowCustomView. ¿Alguien puede ver una razón por la cual esto no está funcionando o sugerir una alternativa?¿Cómo puedo reproducir video html5 en línea en una WebView?

package com.richcollins.VideoView; 

import java.io.ByteArrayOutputStream; 
import java.io.InputStream; 

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.widget.FrameLayout; 
import android.widget.VideoView; 

public class WebViewActivity extends Activity 
{ 
    WebView webView; 
    FrameLayout frameLayout; 

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

     LayoutInflater inflator = getLayoutInflater(); 
     View inflatedView = inflator.inflate(R.layout.webview, null); 

     if (!(inflatedView instanceof FrameLayout)) 
     { 
      throw new RuntimeException("inflated view not FrameLayout"); 
     } 
     else 
     { 
      frameLayout = (FrameLayout)inflatedView; 
     } 

     setContentView(frameLayout); 

     webView = (WebView) findViewById(R.id.webView); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setPluginState(WebSettings.PluginState.ON); 
     webView.setWebChromeClient(new MyWebChromeClient());   

     InputStream inputStream = getResources().openRawResource(R.raw.index); 
     ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
     int readByte; 

     try 
     { 
      while((readByte = inputStream.read()) != -1) 
      { 
       outStream.write(readByte); 
      } 

      String html = outStream.toString("UTF8"); 

      webView.loadDataWithBaseURL("http://localhost/index.html", html, "text/html", "utf-8", "http://localhost/index.html");   
     } 
     catch(Exception e) 
     { 
      throw new RuntimeException(); 
     } 

    } 

    private class MyWebChromeClient extends WebChromeClient implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener { 
     VideoView videoView; 
     WebChromeClient.CustomViewCallback customViewCallback; 

     public void onProgressChanged(WebView view, int newProgress) 
     { 
      if (newProgress == 100) 
      { 
       view.loadUrl("javascript:playVideo()"); 
      } 

     } 

     public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) 
     { 
      customViewCallback = callback; 

      if (view instanceof FrameLayout){ 
       FrameLayout videoFrameLayout = (FrameLayout) view; 

       if (videoFrameLayout.getFocusedChild() instanceof VideoView){ 
        videoView = (VideoView) videoFrameLayout.getFocusedChild(); 
        // hide the video controls 
        videoView.setMediaController(null); 

        //remove videoView from MediaPlayer and ad it to the content view 
        videoFrameLayout.removeView(videoView); 
        frameLayout.addView(videoView, ViewGroup.LayoutParams.WRAP_CONTENT); 

        videoView.setOnCompletionListener(this); 
        videoView.setOnErrorListener(this); 
        videoView.setOnPreparedListener(this); 
        videoView.start(); 
       } 
      } 
     } 

     public void onPrepared(MediaPlayer mp) 
     { 
     } 

     public void onCompletion(MediaPlayer mp) 
     { 
      // this is needed to release the MediaPlayer and its resources so it can 
      // be used again later 
      videoView.stopPlayback(); 

      // now remove the video and tell the callback to hide the custom view 
      frameLayout.removeView(videoView); 
      customViewCallback.onCustomViewHidden(); 

      finish(); 
     } 

     public boolean onError(MediaPlayer mp, int what, int extra) 
     { 
      return false; // we did not handle the error - onCompletion will be called 
     } 
    } 
} 
+0

¿Has comprobado [este hilo] (http://stackoverflow.com/questions/3815090/webview-and-html5-video)? –

+0

Mi respuesta aquí: http://stackoverflow.com/a/16179544/423171 – cprcrack

Respuesta

1

Ver this para un ejemplo de una aplicación que utiliza HTML5 ICS dentro de una vista web para visualizar un video - es de esperar que va a resolver su problema.

si quiere reproducir automáticamente "falso" (que está bloqueado en una vista web) deberá disparar .play() desde el evento de carga de la página. si desea trabajar a través de una lista de reproducción, deberá atrapar y responder al evento activado.

Cuestiones relacionadas