2013-05-14 3 views
4

Android WebView에서 HTML5 페이지에 .mp4 비디오를 표시하면 파일을 원격 URL에서 검색 할 때 비디오 및 오디오가 모두 제대로 재생됩니다. 장치의 "/ mnt/sdcard/...."경로에서 동일한 미디어 파일을 재생하려고하면 미디어 파일의 오디오 부분 만 재생됩니다. 이것에 대한 어떤 생각? 비슷한 것을 경험 한 사람 (그리고 잘하면 해결 된 사람)이 있습니까? 네트워크를 통해 검색 할 때 비디오가 보이지만 코덱 문제 일 수 있습니까? 비디오가 WebView에서 끝나기 전에 어떻게 든 조작되거나 변형 된 네트워크를 통해 반환됩니까?Android WebView에서 HTML5 비디오와 일치하지 않음

다음 코드는 나를 위해 일한
+0

에 로딩 HTML 5 비디오에서 비슷한 문제에 직면하고있어 다른 사람이 (이 예에 https를 참조하면 하드웨어 가속 매니페스트에서 활성화 할 수 있기를 바랍니다. github.com/Offbeatmammal/3718414) – Offbeatmammal

답변

1

, 나는 도 나는 많은 사람들이 같은 문제에 직면하고있다 생각, 그것은 당신이 도움이되기를 바랍니다, 그래서 이것은 내 응용 프로그램 을 실행하는 HTML5 비디오를 얻기 위해 무슨 짓 WebView.

절차으로 안내해 드리겠습니다.

앱의 WebView 안에 여러 HTML 페이지를 차례로로드하려고했습니다. 이 HTML 페이지에는 오디오 뒤에 비디오 또는 비디오 다음에 오디오이옵니다.

다음은 이러한 HTML 페이지 중 하나의 예입니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<html> 
    <head> 
     <title>screen2</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <link href="css/main-v1.css" rel="stylesheet" type="text/css"> 
     <link href="css/screen2-v1.css" rel="stylesheet" type="text/css"> 
     <script src="js/jQueryTest.js"></script> 
    </head> 
    <body>   
     <audio id="audio1" src="audio/screen2_a.mp3"></audio> 
     <video id="video1" src="video/mov_bbb.mp4"></video> 
    </body> 
</html> 

는 지금은 HTML 페이지 안드로이드과 자바 스크립트 사이의 인터페이스 역할을하는 클래스를 만들었습니다. 여기

package com.example.dms; 

import java.io.IOException; 

import com.example.dms.R; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.net.Uri; 
import android.util.Log; 
import android.webkit.JavascriptInterface; 
import android.webkit.WebView; 

public class JsHandler { 
    Activity activity; 
    String TAG = "JsHandler"; 
    WebView webView; 

    public JsHandler(Activity _contxt,WebView _webView) { 
     activity = _contxt; 
     webView = _webView; 
    } 

    /** 
    * This function handles call from JS 
    */ 
    @JavascriptInterface 
    public void initVideo() 
    { 
     webView.loadUrl("javascript:playVideo()"); 
    } 

    public void initAudio() 
    { 
     webView.loadUrl("javascript:playAudio()"); 
    } 

    /** 
    * This function handles call from Android-Java 
    */ 
    public void javaFnCall(String jsString) { 

     final String webUrl = "javascript:diplayJavaMsg('"+jsString+"')"; 
     // Add this to avoid android.view.windowmanager$badtokenexception unable to add window 
     if(!activity.isFinishing()) 
      // loadurl on UI main thread 
     activity.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       webView.loadUrl(webUrl); 
      } 
     }); 
    } 

    /** 
    * function shows Android-Native Alert Dialog 
    */ 
    public void showDialog(String msg){ 

     AlertDialog alertDialog = new AlertDialog.Builder(activity).create(); 
     alertDialog.setTitle(activity.getString(R.string.app_dialog_title)); 
     alertDialog.setMessage(msg); 
     alertDialog.setButton(DialogInterface.BUTTON_POSITIVE,activity.getString(R.string.ok_text), new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int which) 
      { 
       dialog.dismiss(); 
      } 
     }); 
     alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE,activity.getString(R.string.cancel_text), new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       dialog.dismiss(); 
      } 
     }); 
     alertDialog.show(); 
    } 
} 

이것은 웹보기 내부의 HTML 페이지를로드 내 MainActivity의 코드, 내 프로젝트 SRC 폴더에 JsHandler.java라는 JavaScriptInterface 클래스입니다

public class MainActivity extends Activity{ 

//WebView Variables 
private JsHandler _jsHandler; 
private WebView myWebView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    myWebView = (WebView) findViewById(R.id.webView); 

    myWebView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent event) { 
      // TODO Auto-generated method stub 
      if(event.getAction() == MotionEvent.ACTION_DOWN && !view.hasFocus()) { 
        view.requestFocus(); 
       } 
      return false; 
     } 
    }); 

    initWebView(); 
} 

private void initWebView(){ 

    //Tell the WebView to enable javascript execution. 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    myWebView.setBackgroundColor(Color.parseColor("#808080")); 

     //Set whether the DOM storage API is enabled. 
    myWebView.getSettings().setDomStorageEnabled(true); 

     //setBuiltInZoomControls = false, removes +/- controls on screen 
    myWebView.getSettings().setBuiltInZoomControls(false); 

    myWebView.getSettings().setPluginState(PluginState.ON); 
    myWebView.getSettings().setAllowFileAccess(true); 

    myWebView.getSettings().setAppCacheMaxSize(1024 * 8); 
    myWebView.getSettings().setAppCacheEnabled(true); 

    _jsHandler = new JsHandler(this, myWebView);   
    myWebView.addJavascriptInterface(_jsHandler, "JsHandler"); 

    myWebView.getSettings().setUseWideViewPort(false); 
    myWebView.setWebChromeClient(new WebChromeClient()); 
    myWebView.setWebViewClient(new WebViewClient()); 

    // these settings speed up page load into the webview 
    myWebView.getSettings().setRenderPriority(RenderPriority.HIGH); 
    myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 
    myWebView.requestFocus(View.FOCUS_DOWN); 
    myWebView.loadUrl("file:///android_asset/screen2.html"); 

} 

}

귀하의 로드 할 페이지는 프로젝트의 자산 폴더에 있습니다. 내가 무슨 짓을

내가있는 미디어 파일을 배치되는 MNT/SDCARD/I가 태그 따라 오디오 및 비디오의 SRC 속성을 변경해야하는 경우

. 이전에 내가 작성한 JavaScriptInterface 클래스도 언급했듯이이 클래스를 사용하여 HTML 대신 오디오 또는 비디오를 Java에서 재생하도록 호출합니다.

그래서, 여기에) (새로운 HTML 페이지가있는 HTML 페이지가로드가 완전히, 나는 초기화라고 한 때 여기에서 무슨 일이 일어나고 있는지 설명하기 위해

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<html> 
    <head> 
     <title>screen2</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <link href="css/main-v1.css" rel="stylesheet" type="text/css"> 
     <link href="css/screen2-v1.css" rel="stylesheet" type="text/css"> 
     <script src="js/jQueryTest.js"></script> 

     <script> 
      function playVideo() 
      { 
       var cV = document.getElementById("video1"); 
       cV.addEventListener('ended', function() 
               { 
                cV.removeEventListener('ended'); 
                playAudio(); 
               }, false); 
       cV.play(); 
      } 

      function playAudio() 
      { 
       var cA = document.getElementById("audio1"); 
       cA.addEventListener('ended', function() 
               { 
                cA.removeEventListener('ended'); 
                playVideo(); 
               }, false); 
       cA.play(); 
      } 
      function init(){ 

       JsHandler.initVideo(); 
      } 
     </script> 
     <script> 
      $(document).ready(function(){ 
       init(); 
      }); 
     </script> 
    </head> 
    <body> 
      <audio id="audio1" src="/mnt/sdcard/Android/data/com.exapmle.dms/files/resources/audio/screen2_a.mp3"></audio> 
      <video id="video1" src="/mnt/sdcard/Android/data/com.exapmle.dms/files/resources/video/mov_bbb.mp4"></video> 

    </body> 
</html> 

같은 모습입니다; 메소드가 HTML 페이지에 정의되어 있습니다.

이 메서드는 initVideo()를 호출합니다. JsHandler 클래스

당신이 볼 수 있듯이,이 initVideo()에 정의 된 방법; 메서드는 playVideo()를 호출합니다. 메소드가 HTML 페이지에 정의되어 있습니다.

playVideo();를 호출하지 않는 이유가 궁금 할 수 있습니다. 메서드를 직접 페이지로드, 잘 시도하고 그것을 작동하지 않았다 (atleast 나를 위해). // 요점 :

나는 당신을 도와 주거나 웹보기

관련 문제