WebViewClient
非常简单。直到我看完视频为止。视频已作为
HTML5
元素完成,并且这些元素在Chrome,iPhone上可以正常工作,而且现在我们已修复了编码问题,在本机浏览器中对Android
效果很好。现在碰到了:
WebView
不喜欢它。完全没有我可以单击海报图像,但没有任何反应。谷歌搜索,我发现这很接近,但似乎是基于“链接”(如href ...),而不是视频元素。 (onDownloadListener似乎未在视频元素上被调用...)
我还看到了对重写onShowCustomView的引用,但这似乎未在视频元素上被调用... shouldOverrideUrlLoading也不。 br />
我不想进入“从服务器中拉xml,在应用程序中重新格式化” ..通过将故事布局保留在服务器上,我可以更好地控制内容,而不必强迫人们保持更新应用程序。因此,如果我可以说服WebView处理本机浏览器之类的标签,那将是最好的。
我显然缺少明显的东西..但我不知道要做什么。
#1 楼
我回答这个主题的目的是为了防止有人阅读它并对结果感兴趣。可以在WebView中查看视频元素(video 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-10-8 2:59
您完全确定不是编码问题吗?尝试使用我发布的网址。显然,它必须与本机浏览器一起使用
–mdelolmo
2010-10-8 14:49
什么是“ a”?像那样的活动吗?
–科林·普赖斯
2012年8月8日,3:21
@Collin Price a是托管网络视图的Activity的一个实例。 @desgraci,我可以提供,但是除此之外没有太多。使类扩展WebChromeClient并重写所需的相应方法。如果您坚持要讲的话,我回家后可以上传课程的其余部分。
–mdelolmo
2012年7月11日14:28
由于getFocusedChild()不是VideoView,而是HTML5VFullScreen $ SurfaceVideoView,因此无法在ICS上运行。关于如何在ICS上做任何想法? (请参阅stackoverflow.com/questions/13540654/…
–帕斯卡
13年4月16日在18:09
#2 楼
经过长时间的研究,我使这件事起作用了。请参见以下代码: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>
期待您可以理解的其他内容。
评论
这个应该是公认的答案。 Surendra和Malenkiy你们都救了我的理智。对我来说很棒。
–乔治·贝克
2012-12-28 23:26
我同意乔治。这正是Android本机浏览器与VideoView一起工作的方式。似乎这是与此处code.google.com/p/html5webview相同的代码。它适用于所有Android版本(我在Android 2.2及更高版本上进行了测试)。我只想注意一件事,请记住,如果您将目标SDK更改为高于13的值,那么您的活动将在更改方向时重新创建。为了避免这种情况,可以将screenSize附加到android:configChanges(但是在这种情况下,您将需要使用min sdk <13)或使用旧的目标SDK(然后可以保留android:configChanges)
– Yuuriy Ashaev
13年1月16日在18:30
这给我在nexus 7(android 4.1)上的白色空白屏幕。任何想法如何解决这个问题?
– Sahil
13年7月26日在9:15
后退按钮不会停止播放视频和音频,您知道如何解决此问题吗?
– Pedro Lobito
14年7月4日12:4
这就是我要搜索的与本机浏览器流程完全相同的内容。.感谢Ton Surendra和Malenkiy。
– Abhilash
17年7月19日在13:33
#3 楼
mdelolmo的回答非常有用,但是就像他说的那样,该视频只播放一次,然后您无法再次打开它。我仔细研究了一下,这是我发现的,以防万一像我这样疲惫的WebView旅行者将来会偶然发现此帖子。
首先,我查看了VideoView和MediaPlayer的文档,并对它们的工作原理有了更好的了解。我强烈推荐这些。
然后,我查看了源代码,以了解Android Browser的工作方式。查找页面并查看它们如何处理
onShowCustomView()
。他们会保留对CustomViewCallback
和自定义视图的引用。牢记所有这些,并牢记mdelolmo的回答,当您完成视频操作后,您要做的只是两件事。首先,在保存引用的
VideoView
上,调用stopPlayback()
,它将释放MediaPlayer
,以供以后在其他地方使用。您可以在VideoView源代码中看到它。其次,在CustomViewCallback
上保存了一个调用CustomViewCallback.onCustomViewHidden()
的引用。完成这两项操作后,您可以单击同一视频或任何其他视频,并且它将像以前一样打开。无需重新启动整个WebView。
希望有帮助。
评论
其实我也解决了这个问题,只是不记得发布解决方案(对我感到羞耻)。就像您一样,我不得不看一下Android浏览器的代码,而且要添加的东西并不多,我使用了onCompletion侦听器来停止Player,并且不得不设置几次可见性,但是我会购买您的解决方案。问候!
–mdelolmo
2011年1月10日7:57
Google代码搜索已停用,我认为此版本的BrowserActivity.java(来自Froyo)大致对应于此处描述的版本:github.com/android/platform_packages_apps_browser/blob/…
–michiakig
2012年1月24日19:12
@spacemanki的链接代码在整个回购中均未提及VideoView。我想BrowserActivity现在做的有所不同。我什至回到了Eclair版本。找不到任何用法。
–mxcl
2012年3月22日18:56
我遇到的所有问题是我从frame.getFocusedChild();返回的内容是什么?是HTml5VideoView而不是ViewView,因此这对我都不起作用,因此无法切换到全屏模式:(我使用的是Android 4.1.2。
– Gonan
13年1月18日在12:59
最后为我做的是添加:@Override public void onStop(){super.onStop(); mWebView.destroy(); }对于活动... webview.destroy()至关重要
– MacD
13-4-4在12:53
#4 楼
我知道这个线程已经使用了几个月,但是我找到了一种解决方案,可以在WebView内播放视频而不全屏显示(但仍在媒体播放器中...)。到目前为止,我在互联网上没有找到任何提示,所以也许这对于其他人也很有趣。我仍在努力解决某些问题(例如,将媒体播放器放在屏幕的右侧,不知道为什么我做错了,但是我认为这是一个相对较小的问题...)。
在Custom 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上进行这项工作的任何想法吗?
–帕斯卡
13年4月16日在18:11
#5 楼
实际上,仅将股票WebChromeClient附加到客户端视图alamWebView.setWebChromeClient(new WebChromeClient());
似乎就足够了,您需要打开硬件加速!
至少,如果您不需要播放全屏视频,则无需将VideoView从WebView中拉出并将其推到Activity的视图中。它将以视频元素的分配矩形播放。
任何想法如何拦截扩展视频按钮?
评论
您可以使用WebChromeClient并覆盖onShowCustomView来拦截它
–坦白
2013年12月17日上午11:05
请指定哪个版本的Android。这对于不同版本的工作方式有所不同。
– Ethan_AI
2014年11月13日在18:09
#6 楼
这种方法在2.3之前都行之有效。通过添加hardwareaccelerated = true,它甚至可以在3.0到ICS上运行。
我目前面临的一个问题是第二次启动媒体播放器应用时崩溃了,因为我没有停止播放和释放媒体播放器。
作为VideoSurfaceView对象,我们从3.0 OS的onShowCustomView函数中获取该对象,它特定于浏览器,而不是直到2.3 OS之前的VideoView对象。
我如何访问它并停止播放并释放资源?
#7 楼
A-M与BrowerActivity相似。用于
FrameLayout.LayoutParams LayoutParameters =新的FrameLayout.LayoutParams(768,512);
我认为我们可以使用
FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,
FrameLayout.LayoutParams.FILL_PARENT)
代替。
我遇到的另一个问题是视频是否正在播放,并且用户单击“后退”按钮,下一次,您进入此活动(单首),并且无法播放视频。要解决此问题,我在活动的onBackPressed方法中调用了
try {
mCustomVideoView.stopPlayback();
mCustomViewCallback.onCustomViewHidden();
} catch(Throwable e) { //ignore }
。
#8 楼
我知道这是一个非常老的问题,但是您是否尝试过为应用程序或活动使用hardwareAccelerated="true"
清单标志?使用此设置,它似乎无需任何WebChromeClient修改即可正常工作(我希望从DOM元素。)
评论
hardwareAccelerated从Android 3.0开始
–vbence
2012年1月4日19:56
#9 楼
我使用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);
}
#10 楼
这个问题已有很长的历史了,但是也许我的回答会对像我这样必须支持旧版Android的人们有所帮助。我尝试了许多适用于某些Android版本的方法,但不适用于所有版本。我发现最好的解决方案是使用Crosswalk Webview,该视图针对HTML5功能支持进行了优化,可在Android 4.1及更高版本上使用。它与默认的Android WebView一样简单。您只需要包括库。在这里您可以找到有关如何使用它的简单教程:https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/评论
注意:人行横道不再维护。
–slhck
19年2月6日在10:07
#11 楼
好吧,显然,如果不使用JNI注册插件来获取视频事件,就无法实现。 (就我个人而言,我避免使用JNI,因为在接下来的几个月中基于Atom的android平板电脑问世时,我真的不想处理混乱,失去了Java的可移植性。)唯一的真正的替代方法似乎是只为WebView创建一个新网页,并使用上面的Codelark网址中引用的A HREF链接以老式的方式进行视频播放。
Icky。
#12 楼
在蜂窝网络上使用hardwareaccelerated=true
和pluginstate.on_demand
似乎可以工作#13 楼
我有一个类似的问题。我的应用程序的资源文件夹中有HTML文件和视频。因此,这些视频位于APK的内部。由于APK实际上是一个ZIP文件,因此WebView无法读取视频文件。
将所有HTML和视频文件复制到SD卡上对我来说很有效。
评论
请参阅:code.google.com/p/android/issues/detail?id=22254同样,我正在为我的网站寻找HTML5播放器。我该怎么用?
我在这里的答案:stackoverflow.com/a/16179544/423171
什么都没用,所以我在这里研究了VideoEnabledWebView stackoverflow.com/questions/15768837 / ...