WebView和HTML5 <视频>


122

我正在拼凑一个cheapo应用程序,该应用程序除其他外可以“构架”我们的某些网站...使用,非常简单WebViewClient。直到我看了视频。

视频是作为HTML5 元素完成的,在Chrome,iPhone上这些视频可以正常工作,而且现在我们已解决了编码问题,Android在本机浏览器中效果很好。

现在的问题是:WebView不喜欢它。完全没有 我可以单击海报图像,但没有任何反应。

谷歌搜索,我发现很接近,但似乎是基于“链接”(如href ...),而不是视频元素。(onDownloadListener似乎未在视频元素上被调用...)

我还看到了有关覆盖onShowCustomView的引用,但似乎未在视频元素上调用……shouldOverrideUrlLoading也没有。

我宁愿不要进入“从服务器中提取xml,在应用程序中重新格式化它” ..通过在服务器上保留故事的布局,我可以更好地控制内容,而不必强迫人们不断更新应用程序。因此,如果我可以说服WebView处理本机浏览器之类的标签,那将是最好的。

我显然缺少明显的东西。但是我不知道是什么。



同样,我正在为我的网站寻找HTML5播放器。我应该使用什么?
Wolfpack'08 2012年


1
没有工作,所以我看着VideoEnabledWebView这里stackoverflow.com/questions/15768837/...
EpicPandaForce

Answers:


92

我回答这个主题是为了防止有人阅读它并对结果感兴趣。可以在WebView中查看视频元素(视频html5标签),但是我必须说我不得不处理几天。到目前为止,我必须遵循以下步骤:

-查找正确编码的视频

-初始化WebView时,设置JavaScript,插入WebViewClient和WebChromeClient。

url = new String(“ http://broken-links.com/tests/video/”); 
mWebView =(WebView)findViewById(R.id.webview);
mWebView.setWebChromeClient(chromeClient);
mWebView.setWebViewClient(wvClient);
mWebView.getSettings()。setJavaScriptEnabled(true);
mWebView.getSettings()。setPluginState(PluginState.ON);
mWebView.loadUrl(url);

-处理WebChromeClient对象中的onShowCustomView。

@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
    super.onShowCustomView(view, callback);
    if (view instanceof FrameLayout){
        FrameLayout frame = (FrameLayout) view;
        if (frame.getFocusedChild() instanceof VideoView){
            VideoView video = (VideoView) frame.getFocusedChild();
            frame.removeView(video);
            a.setContentView(video);
            video.setOnCompletionListener(this);
            video.setOnErrorListener(this);
            video.start();
        }
    }
}

-处理视频的onCompletion和onError事件,以便返回到Web视图。

public void onCompletion(MediaPlayer mp) {
    Log.d(TAG, "Video completo");
    a.setContentView(R.layout.main);
    WebView wb = (WebView) a.findViewById(R.id.webview);
    a.initWebView();
}

但是现在我应该说还有一个重要的问题。我只能播放一次。第二次单击视频分发器(海报或某些播放按钮)时,它什么也没做。

我也希望视频在WebView框架内播放,而不是打开Media Player窗口,但这对我来说是个次要问题。

希望对您有所帮助,也要感谢您的任何评论或建议。

Saludos,terrícolas。


我没有运行任何结果,我的屏幕是黑色的。我想知道这是否需要广告​​。我的代码太长,无法在此处摆弄。您能给我一些联系方式还是打开另一个主题。
pengwang 2010年

您完全确定不是编码问题吗?尝试使用我发布的网址。显然,它必须与本机浏览器一起使用
mdelolmo 2010年

46
什么是“ a”?像那样的活动吗?
Collin Price

1
@Collin Price a是托管网络视图的Activity的一个实例。@desgraci,我可以提供,但是除此之外没有太多。使一个类扩展WebChromeClient并覆盖所需的相应方法。如果您坚持要讲的话,我回家后可以上传课程的其余部分。
mdelolmo 2012年

6
由于getFocusedChild()不是VideoView,而是HTML5VFullScreen $ SurfaceVideoView,因此无法在ICS上运行。关于如何在ICS上做任何想法?(请参阅 stackoverflow.com/questions/13540654/…–
Pascal,

61

经过长时间的研究,我使这件事起作用了。请参见以下代码:

Test.java

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class Test extends Activity {

    HTML5WebView mWebView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mWebView = new HTML5WebView(this);

        if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
        } else {    
            mWebView.loadUrl("http://192.168.1.18/xxxxxxxxxxxxxxxx/");
        }

        setContentView(mWebView.getLayout());
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mWebView.saveState(outState);
    }

    @Override
    public void onStop() {
        super.onStop();
        mWebView.stopLoading();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mWebView.inCustomView()) {
                mWebView.hideCustomView();
            //  mWebView.goBack();
                //mWebView.goBack();
                return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }
}

HTML%VIDEO.java

package com.ivz.idemandtest;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

public class HTML5WebView extends WebView {

    private Context                             mContext;
    private MyWebChromeClient                   mWebChromeClient;
    private View                                mCustomView;
    private FrameLayout                         mCustomViewContainer;
    private WebChromeClient.CustomViewCallback  mCustomViewCallback;

    private FrameLayout                         mContentView;
    private FrameLayout                         mBrowserFrameLayout;
    private FrameLayout                         mLayout;

    static final String LOGTAG = "HTML5WebView";

    private void init(Context context) {
        mContext = context;     
        Activity a = (Activity) mContext;

        mLayout = new FrameLayout(context);

        mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(a).inflate(R.layout.custom_screen, null);
        mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.main_content);
        mCustomViewContainer = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.fullscreen_custom_content);

        mLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);

        // Configure the webview
        WebSettings s = getSettings();
        s.setBuiltInZoomControls(true);
        s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        s.setUseWideViewPort(true);
        s.setLoadWithOverviewMode(true);
      //  s.setSavePassword(true);
        s.setSaveFormData(true);
        s.setJavaScriptEnabled(true);
        mWebChromeClient = new MyWebChromeClient();
        setWebChromeClient(mWebChromeClient);

        setWebViewClient(new WebViewClient());

setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        // enable navigator.geolocation 
       // s.setGeolocationEnabled(true);
       // s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

        // enable Web Storage: localStorage, sessionStorage
        s.setDomStorageEnabled(true);

        mContentView.addView(this);
    }

    public HTML5WebView(Context context) {
        super(context);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public FrameLayout getLayout() {
        return mLayout;
    }

    public boolean inCustomView() {
        return (mCustomView != null);
    }

    public void hideCustomView() {
        mWebChromeClient.onHideCustomView();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if ((mCustomView == null) && canGoBack()){
                goBack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private class MyWebChromeClient extends WebChromeClient {
        private Bitmap      mDefaultVideoPoster;
        private View        mVideoProgressView;

        @Override
        public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
        {
            //Log.i(LOGTAG, "here in on ShowCustomView");
            HTML5WebView.this.setVisibility(View.GONE);

            // if a view already exists then immediately terminate the new one
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }

            mCustomViewContainer.addView(view);
            mCustomView = view;
            mCustomViewCallback = callback;
            mCustomViewContainer.setVisibility(View.VISIBLE);
        }

        @Override
        public void onHideCustomView() {
            System.out.println("customview hideeeeeeeeeeeeeeeeeeeeeeeeeee");
            if (mCustomView == null)
                return;        

            // Hide the custom view.
            mCustomView.setVisibility(View.GONE);

            // Remove the custom view from its container.
            mCustomViewContainer.removeView(mCustomView);
            mCustomView = null;
            mCustomViewContainer.setVisibility(View.GONE);
            mCustomViewCallback.onCustomViewHidden();

            HTML5WebView.this.setVisibility(View.VISIBLE);
            HTML5WebView.this.goBack();
            //Log.i(LOGTAG, "set it to webVew");
        }


        @Override
        public View getVideoLoadingProgressView() {
            //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");

            if (mVideoProgressView == null) {
                LayoutInflater inflater = LayoutInflater.from(mContext);
                mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);
            }
            return mVideoProgressView; 
        }

         @Override
         public void onReceivedTitle(WebView view, String title) {
            ((Activity) mContext).setTitle(title);
         }

         @Override
         public void onProgressChanged(WebView view, int newProgress) {
             ((Activity) mContext).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
         }

         @Override
         public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
             callback.invoke(origin, true, false);
         }
    }


    static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
        new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

custom_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout android:id="@+id/fullscreen_custom_content"
        android:visibility="gone"
        android:background="@color/black"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
    <LinearLayout android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout android:id="@+id/error_console"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
        />

        <FrameLayout android:id="@+id/main_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
        />
    </LinearLayout>
</FrameLayout>

video_loading_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/progress_indicator"
         android:orientation="vertical"
         android:layout_centerInParent="true"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">

       <ProgressBar android:id="@android:id/progress"
           style="?android:attr/progressBarStyleLarge"
           android:layout_gravity="center"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />

       <TextView android:paddingTop="5dip"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:text="@string/loading_video" android:textSize="14sp"
           android:textColor="?android:attr/textColorPrimary" />
 </LinearLayout>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/any/http_authentication_colors.xml
**
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/
-->
<!-- FIXME: Change the name of this file!  It is now being used generically
    for the browser -->
<resources>
    <color name="username_text">#ffffffff</color>
    <color name="username_edit">#ff000000</color>

    <color name="password_text">#ffffffff</color>
    <color name="password_edit">#ff000000</color>

    <color name="ssl_text_label">#ffffffff</color>
    <color name="ssl_text_value">#ffffffff</color>

    <color name="white">#ffffffff</color>
    <color name="black">#ff000000</color>



    <color name="geolocation_permissions_prompt_background">#ffdddddd</color>
</resources>

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Test"
                  android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:configChanges="orientation|keyboardHidden|keyboard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>  
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
</manifest>

期待您可以理解的其他事情。


7
这个应该是公认的答案。Surendra和Malenkiy你们都救了我的理智。对我来说很棒。
乔治·贝克

我同意乔治的说法。这正是Android本机浏览器与VideoView一起工作的方式。似乎这是与此处code.google.com/p/html5webview相同的代码。它适用于所有Android版本(我在Android 2.2及更高版本上进行了测试)。我只想注意一件事,请记住,如果您将目标SDK更改为高于13的值,那么您的活动将在更改方向时重新创建。为了避免这种情况,可以将screenSize追加到android:configChanges(但是在这种情况下,您将需要使用min sdk <13)或使用旧的目标SDK(然后您可以保留android:configChanges)
Yuriy Ashaev 2013年

2
这给我在nexus 7(android 4.1)上的白色空白屏幕。任何想法如何解决这个问题?
萨希尔

后退按钮不会停止视频和音频的播放,不知道如何解决?
2014年

这就是我要搜索的与本机浏览器流程完全相同的内容。.感谢Ton Surendra和Malenkiy。
Abhilash

33

mdelolmo的回答非常有用,但是就像他说的那样,该视频只播放一次,因此您无法再次打开它。

我仔细研究了一下,这是我发现的,以防万一像我这样的疲惫的WebView旅行者将来会偶然发现此帖子。

首先,我查看了VideoViewMediaPlayer的文档,并对它们的工作方式有了更好的了解。我强烈推荐那些。

然后,我查看了源代码,以了解Android Browser的工作方式。查找页面并查看它们的处理方式onShowCustomView()。他们保留对CustomViewCallback和自定义视图的引用。

考虑到所有这些,并牢记mdelolmo的回答,当完成视频操作后,您要做的只是两件事。首先,在VideoView保存了引用的上,调用stopPlayback()将释放,MediaPlayer以便稍后在其他地方使用。您可以在VideoView源代码中看到它。其次,CustomViewCallback您在上保存了对call的引用CustomViewCallback.onCustomViewHidden()

完成上述两项操作后,您可以单击同一视频或任何其他视频,它会像以前一样打开。无需重新启动整个WebView。

希望有帮助。


实际上我也解决了这个问题,只是不记得发布解决方案(对我感到羞耻)。就像您一样,我不得不看一下Android浏览器的代码,而且要添加的东西并不多,我改用了onCompletion侦听器来停止Player,并且不得不设置几次可见性,但是我会购买您的解决方案。问候!
mdelolmo 2011年

1
Google代码搜索已停用
2012年

@spacemanki的链接代码在整个仓库中都没有提及VideoView。我想BrowserActivity现在做的有所不同。我什至回到了Eclair版本。找不到任何用法。
mxcl 2012年

我遇到的所有问题是我从frame.getFocusedChild();返回的内容是什么?是HTml5VideoView而不是ViewView,因此这对我都不起作用,因此无法切换到全屏模式:(我使用的是Android
4.1.2。– Gonan

1
最后为我做的是添加:@Override public void onStop(){super.onStop(); mWebView.destroy(); }对于活动... webview.destroy()至关重要
MacD 2013年

8

实际上,仅将股票WebChromeClient附加到客户端视图就足够了,

mWebView.setWebChromeClient(new WebChromeClient());

并且您需要打开硬件加速!

至少,如果您不需要播放全屏视频,则无需将VideoView从WebView中拉出并将其推入Activity的视图。它将以视频元素的分配矩形播放。

有什么想法可以拦截扩展视频按钮吗?


你可以用它WebChromeClient并覆盖onShowCustomView拦截
弗兰克

请指定哪个版本的Android。这对于不同版本的工作方式有所不同。
Ethan_AI 2014年

7

我知道这个线程已经使用了几个月,但是我找到了一种解决方案,可以在WebView内播放视频而不全屏显示(但仍在媒体播放器中...)。到目前为止,我在互联网上没有发现任何提示,因此也许这对于其他人也很有趣。我仍然在某些问题上苦苦挣扎(例如,将媒体播放器放在屏幕的右侧,不知道为什么我做错了,但是我认为这是一个相对较小的问题...)。

在自定义ChromeClient中,指定LayoutParams:

// 768x512 is the size of my video
FrameLayout.LayoutParams LayoutParameters = 
                                     new FrameLayout.LayoutParams (768, 512); 

我的onShowCustomView方法看起来像这样:

public void onShowCustomView(final View view, final CustomViewCallback callback) {
     // super.onShowCustomView(view, callback);
     if (view instanceof FrameLayout) {
         this.mCustomViewContainer = (FrameLayout) view;
         this.mCustomViewCallback = callback;
         this.mContentView = (WebView) this.kameha.findViewById(R.id.webview);
         if (this.mCustomViewContainer.getFocusedChild() instanceof VideoView) {
             this.mCustomVideoView = (VideoView) 
                                     this.mCustomViewContainer.getFocusedChild();
             this.mCustomViewContainer.setVisibility(View.VISIBLE);
             final int viewWidth = this.mContentView.getWidth();
             final int viewLeft = (viewWidth - 1024) / 2;
             // get the x-position for the video (I'm porting an iPad-Webapp to Xoom, 
             // so I can use those numbers... you have to find your own of course...
             this.LayoutParameters.leftMargin = viewLeft + 256; 
             this.LayoutParameters.topMargin = 128;
             // just add this view so the webview underneath will still be visible, 
             // but apply the LayoutParameters specified above
             this.kameha.addContentView(this.mCustomViewContainer, 
                                             this.LayoutParameters); 
             this.mCustomVideoView.setOnCompletionListener(this);
             this.mCustomVideoView.setOnErrorListener(this);
             // handle clicks on the screen (turning off the video) so you can still
             // navigate in your WebView without having the video lying over it
             this.mCustomVideoView.setOnFocusChangeListener(this); 
             this.mCustomVideoView.start();
         }
     }
 }

因此,我希望我能提供帮助...我也不得不玩视频编码,并且看到了将WebView与html5视频一起使用的各种方式-最终,我的工作代码是我发现的不同代码部分的疯狂混合互联网和我必须自己弄清楚的一些事情。这确实是一个痛苦*。


在ICS上,getFocusedChild()不返回VideoView。关于如何在ICS上进行这项工作的任何想法吗?
Pascal

4

这种方法在2.3之前都可以正常工作,并且通过添加hardwareaccelerated = true甚至可以在3.0到ICS上工作。我目前面临的一个问题是第二次启动媒体播放器应用程序时崩溃了,因为我没有停止播放并发布媒体播放器。作为VideoSurfaceView对象,我们从3.0 OS的onShowCustomView函数中获取该对象,它特定于浏览器,而不是像2.3 OS那样的VideoView对象,我如何访问它并停止播放和释放资源?


3

AM与BrowerActivity的功能相似。用于FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(768,512);

我认为我们可以使用

FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,
            FrameLayout.LayoutParams.FILL_PARENT) 

代替。

我遇到的另一个问题是,如果正在播放视频,并且用户单击“后退”按钮,那么下次您转到此活动(单首),则无法播放视频。为了解决这个问题,我打电话给

try { 
    mCustomVideoView.stopPlayback();  
    mCustomViewCallback.onCustomViewHidden();
} catch(Throwable e) { //ignore }

在活动的onBackPressed方法中。


2

我知道这是一个非常老的问题,但是您是否尝试过hardwareAccelerated="true"针对应用程序或活动的清单标志?

有了这个设置,它似乎不需要任何WebChromeClient修改就可以正常工作(我希望从DOM元素中获得它)。


2
hardwareAccelerated从Android 3.0开始
vbence 2012年

2

我使用html5webview解决了这个问题。下载并将其放入您的项目中,然后就可以像这样编写代码了。

private HTML5WebView mWebView;
String url = "SOMEURL";
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mWebView = new HTML5WebView(this);
    if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
    } else {
            mWebView.loadUrl(url);
    }
    setContentView(mWebView.getLayout());
}
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
}

要使视频可旋转,请将android:configChanges =“ orientation”代码放入您的Activity中,例如(Androidmanifest.xml)

<activity android:name=".ui.HTML5Activity" android:configChanges="orientation"/>

并覆盖onConfigurationChanged方法。

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
}

2

这个问题已有多年历史了,但是也许我的回答会对像我这样必须支持旧版Android的人们有所帮助。我尝试了许多适用于某些Android版本的方法,但不适用于所有版本。我发现最好的解决方案是使用Crosswalk Webview,该视图针对HTML5功能支持进行了优化,可在Android 4.1及更高版本上使用。它与默认的Android WebView一样简单。您只需要包括库。在这里您可以找到有关如何使用它的简单教程:https : //diego.org/2015/01/07/embedding-crosswalk-in-android-studio/


注意:不再维护人行横道。
slhck

1

好吧,显然,如果不使用JNI注册插件来获取视频事件,就无法实现。(就我个人而言,我避免使用JNI,因为在接下来的几个月中基于Atom的android平板电脑问世时,我真的不想处理混乱的事情,从而失去了Java的可移植性。)

唯一可行的替代方案似乎是仅为WebView创建一个新网页,并使用上面的Codelark网址中引用的A HREF链接以老式的方式进行视频录制。

讨厌


1

关于蜂窝使用hardwareaccelerated=truepluginstate.on_demand似乎有效


1

我有一个类似的问题。我的应用程序资产文件夹中有HTML文件和视频。

因此,视频位于APK内部。由于APK实际上是一个ZIP文件,因此WebView无法读取视频文件。

将所有HTML和视频文件复制到SD卡对我来说很有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.