2011-08-09 18 views
9

WebViewでhtml5ビデオをインラインで再生する必要があります。私は動作するはずのテクニックを見つけましたが、散発的にしか動作しません(質問の終わりを参照)。動作しない場合、onShowCustomViewは呼び出されません。誰もこれが働いていない、あるいは代替案を提案する理由を見ることができますか?うまくいけば、それはあなたの問題を解決します -WebViewでhtml5ビデオをインラインで再生するにはどうすればよいですか?

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

[このスレッド](http://stackoverflow.com/questions/3815090/webview-and-html5-video)をチェックしましたか? –

+0

私の答えはこちら:http://stackoverflow.com/a/16179544/423171 – cprcrack

答えて

1

は、ビデオを表示するには、WebViewの内HTML5を使用してICSアプリの例についてはthisを参照してください。

自動再生(ウェブビューでブロックされている)を "偽造"したい場合は、ページonloadイベントから.play()をトリガーする必要があります。プレイリストを処理したい場合は、オンエンドイベントをトラップして応答する必要があります。

関連する問題