0

이 주제와 관련하여 많은 질문이 있지만 그 중 누구도 나를 도왔습니다. ( JavaScript를 통해 매개 변수를 전달할 때 VideoView에서 비디오를 재생하기 위해 Java 메소드를 호출하려고합니다. 웹보기, 그러나 나는 다음과 같은 문제로 실행하고 있습니다 : activity_main에서WebView에서 VideoView를 사용할 때 RuntimeException이 발생합니다. -

  1. , 그때 나는 검은 색 빈 화면을 얻고 웹보기 내부 VideoView를 지켜 보면서 태그가있을 때, 기본적으로 내 HTML로드 점점되지 activity_main에서
  2. 때. 나는 VideoView를 사용하지 않고 WebView 만 사용하면 내 HTML이 표시되지만 VideoView vv = new VideoView (this)를 사용하여 VideoView를 인스턴스화 할 때 Uncaught Error가 발생합니다. .
  3. WebView 및 VideoView 태그 주위에서 상대 태그 또는 선형 태그를 사용하면 응용 프로그램이 시작되지 않습니다.

누군가이 코드를 작동시키기 위해 내 activty_main.xml을 정제하는 데 도움을 줄 수 있습니까? 내 코드 조각을 검색 할 수 있습니다 :

내 activity_main.xml :

<WebView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/WebView123"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:layout_weight="1.0" > 
       <!--On removing this VideoView, HTML getting displayed but Video not gettin launched 
        <VideoView android:id="@+id/videoView" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        /> 
        </WebView> 

내 MainActivty.java 웹보기에 대한

      public class MainActivity extends Activity { 

     WebView browser; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    browser = (WebView) findViewById(R.id.WebView123); 
    WebSettings webSettings = browser.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND); 
    webSettings.setAllowFileAccessFromFileURLs(true); 
    browser.setWebChromeClient(new WebChromeClient()); 
    browser.setWebViewClient(new WebViewClient(){ 
       @Override 
       public boolean shouldOverrideUrlLoading(browser , String url) { 
       return false; 
       } 
       }); 
       MainActivity jsInterface = new MainActivity(); 
    browser.addJavascriptInterface(jsInterface, "interfaces"); 
    browser.loadUrl("file:///android_asset/index.html"); 
    setContentView(browser); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@JavascriptInterface 
public void videoPlayer(String identifer){ 
    System.out.println("Hey I am in Here"); 
    // 2nd Point - > VideoView videoHolder = new VideoView(this); 
    VideoView videoHolder = (VideoView) findViewById(R.id.videoView); 

    MediaController mc = new MediaController(this); 
    mc.setAnchorView(videoHolder); 
    videoHolder.setMediaController(mc); 
    if(identifer.equals("1")){ 
     String path = "android.resource://" + R.raw.intro; 
     videoHolder.setVideoURI(Uri.parse(path)); 
     } 
     videoHolder.start(); 
     videoHolder.requestFocus(); 
      } 
       } //class end 

내 HTML :

    <button onClick="window.interfaces.videoPlayer('1');">Button</button> 

답변

0

방법 # 1에 대해서 실제로 후자는 순수하게 사용하기 때문에 VideoViewWebView 안에 넣을 수 없습니다. d 웹 페이지를 그립니다.

접근 방식 # 2에 관해서는, JavascriptInterface은 JS 엔진에서 호출되므로 Android UI 기본 스레드에서 실행되지 않습니다. 즉, UI 구성 요소에 액세스 할 수있는 경우 (VideoViewfindViewById() 경유로 조작 한 경우),이를 UI 기본 스레드로 이동해야합니다. Android에서는 일부 조작, 특히보기 조작이 UI 기본 스레드에서만 실행될 수 있기 때문에.

더 구체적으로 runOnUiThread()을 사용하거나 MainActivty.java에서 동영상을 시작하기위한 의도를 보낼 수 있습니다.