【问题标题】:RuntimeException when using VideoView in WebView - Android在 WebView 中使用 VideoView 时出现 RuntimeException - Android
【发布时间】:2014-01-23 20:53:08
【问题描述】:

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

  1. 在activity_main中,当我在WebView中有VideoView标签时,我得到一个空白的黑屏,基本上我的HTML没有被加载。
  2. 在 activity_main 中,当我不使用 VideoView 但仅使用 WebView 时,我的 HTML 会显示,但在使用 VideoView vv = new VideoView(this) 实例化 VideoView 时出现未捕获错误。
  3. 在 WebView 和 VideoView 标记周围使用相对或线性标记时不允许应用程序启动。

有人可以帮助我完善我的 activty_main.xml 以使此代码正常工作吗?请在下面找到我的代码 sn-ps:

我的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> 

【问题讨论】:

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


    【解决方案1】:

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

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

    更具体地说,您可能想要使用runOnUiThread(),或发送一个意图以在您的MainActivty.java 中启动视频。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2018-06-24
      相关资源
      最近更新 更多