在WebView中使用VideoView时的RuntimeException - Android

时间:2014-01-23 20:53:09

标签: android android-layout webview android-webview android-videoview

我知道围绕这个主题提出了很多问题,但没有一个问题对我有所帮助:( 我试图在通过WebView传递参数时调用java方法在VideoView中播放视频,但我遇到了以下问题:

  1. 在activity_main中,当我在WebView中有VideoView标记时,我得到一个空白的黑屏,基本上我的HTML没有被加载。
  2. 在activity_main中,当我不使用VideoView而只使用WebView时,我的HTML会显示但是在使用VideoView vv = new VideoView(this)实例化VideoView时我得到未捕获错误。
  3. 在WebView和VideoView标签周围使用相对或线性标签,不让应用程序启动。
  4. 有人可以帮我改进我的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
    

    我的WebView HTML:

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

1 个答案:

答案 0 :(得分:0)

关于方法#1,实际上你不能将VideoView放在WebView内,因为后者纯粹用于绘制网页。

关于方法#2,请注意,{UI}主线程中未执行JavascriptInterface,因为它是从JS引擎调用的。即如果您有权访问UI组件(在您的情况下,您通过VideoView操纵findViewById()),则需要将其移动到UI主线程中。因为在Android中,某些操作,尤其是视图操作,只允许在UI主线程中执行。

更具体地说,您可能希望使用runOnUiThread(),或发送意图来启动MainActivty.java中的视频。