如何在 Android WebView 中以全屏模式播放视频并退出全屏模式?
How to play a video in fullscreen mode and exit fullscreen mode in Android WebView?
我知道这是一个老问题,已经被问过很多次了。但是我尝试了很多他们不适合我的解决方案。
我在我的华为 6P 和三星 S7、Nexus 5、
WebView 中的视频 (https://www.youtube-nocookie.com/embed/M68lNfqmTNk?rel=0&rel=0&showinfo=0) 未按预期工作(去年工作。)。
当我点击全屏按钮时,"onShowCustomView" 和 "onHideCustomView" 被连续调用。所以我可以看到视频闪烁(非全屏 -> 全屏 -> 非全屏)。
有时运气好的话,视频会进入全屏模式,但如果按全屏按钮退出全屏模式,该按钮根本不起作用。
我在GitHub写了一个demo,希望大家帮帮我。谢谢。
这是代码
初始化网页视图:
mWebView = (WebView)findViewById(R.id.webview);
mWebChromeClient = new MyWebChromeClient();
mWebView.setWebChromeClient(mWebChromeClient);
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mWebView.loadUrl(url);
return true;
}
});
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setAllowFileAccess(true);
webSettings.setSupportZoom(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
我的WebChrome客户端:
public class MyWebChromeClient extends WebChromeClient {
FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
Log.d("youtube", "onShowCustomView");
// if a view already exists then immediately terminate the new one
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mContentView = (ConstraintLayout) findViewById(R.id.activity_main);
mContentView.setVisibility(View.GONE);
mCustomViewContainer = new FrameLayout(MainActivity.this);
mCustomViewContainer.setLayoutParams(LayoutParameters);
mCustomViewContainer.setBackgroundResource(android.R.color.black);
view.setLayoutParams(LayoutParameters);
mCustomViewContainer.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mCustomViewContainer.setVisibility(View.VISIBLE);
setContentView(mCustomViewContainer);
}
@Override
public void onHideCustomView() {
Log.d("youtube", "onHideCustomView");
if (mCustomView == null) {
return;
} else {
// 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();
// Show the content view.
mContentView.setVisibility(View.VISIBLE);
setContentView(mContentView);
}
}
}
我确实在 AndroidManifest.xml
中设置了 android:hardwareAccelerated
android:hardwareAccelerated="true"
我认为这个问题已经预定义了很多答案
但我认为你只需要检查一次这个答案 markparnelllink
在那link标记定义的解决方案非常详细
要在网络视图中加载 youtube 视频,您必须改用 iframe,
例如:
<iframe width="300" height=".." src="http://www.youtube.com/embed/M68lNfqmTNk" frameborder="0" allowfullscreen></iframe>
并将 html 文本加载到 webview,如下所示:<html><body> <iframe width="330" height="315" src="http://www.youtube.com/embed/M68lNfqmTNk" frameborder="0" allowfullscreen></iframe>....
在您的网络视图中添加此代码。
webView.getSettings().setUserAgentString("Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
我知道这是一个老问题,已经被问过很多次了。但是我尝试了很多他们不适合我的解决方案。
我在我的华为 6P 和三星 S7、Nexus 5、 WebView 中的视频 (https://www.youtube-nocookie.com/embed/M68lNfqmTNk?rel=0&rel=0&showinfo=0) 未按预期工作(去年工作。)。 当我点击全屏按钮时,"onShowCustomView" 和 "onHideCustomView" 被连续调用。所以我可以看到视频闪烁(非全屏 -> 全屏 -> 非全屏)。 有时运气好的话,视频会进入全屏模式,但如果按全屏按钮退出全屏模式,该按钮根本不起作用。
我在GitHub写了一个demo,希望大家帮帮我。谢谢。
这是代码
初始化网页视图:
mWebView = (WebView)findViewById(R.id.webview);
mWebChromeClient = new MyWebChromeClient();
mWebView.setWebChromeClient(mWebChromeClient);
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mWebView.loadUrl(url);
return true;
}
});
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setAllowFileAccess(true);
webSettings.setSupportZoom(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
我的WebChrome客户端:
public class MyWebChromeClient extends WebChromeClient {
FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
Log.d("youtube", "onShowCustomView");
// if a view already exists then immediately terminate the new one
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mContentView = (ConstraintLayout) findViewById(R.id.activity_main);
mContentView.setVisibility(View.GONE);
mCustomViewContainer = new FrameLayout(MainActivity.this);
mCustomViewContainer.setLayoutParams(LayoutParameters);
mCustomViewContainer.setBackgroundResource(android.R.color.black);
view.setLayoutParams(LayoutParameters);
mCustomViewContainer.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mCustomViewContainer.setVisibility(View.VISIBLE);
setContentView(mCustomViewContainer);
}
@Override
public void onHideCustomView() {
Log.d("youtube", "onHideCustomView");
if (mCustomView == null) {
return;
} else {
// 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();
// Show the content view.
mContentView.setVisibility(View.VISIBLE);
setContentView(mContentView);
}
}
}
我确实在 AndroidManifest.xml
中设置了 android:hardwareAcceleratedandroid:hardwareAccelerated="true"
我认为这个问题已经预定义了很多答案 但我认为你只需要检查一次这个答案 markparnelllink
在那link标记定义的解决方案非常详细
要在网络视图中加载 youtube 视频,您必须改用 iframe, 例如:
<iframe width="300" height=".." src="http://www.youtube.com/embed/M68lNfqmTNk" frameborder="0" allowfullscreen></iframe>
并将 html 文本加载到 webview,如下所示:<html><body> <iframe width="330" height="315" src="http://www.youtube.com/embed/M68lNfqmTNk" frameborder="0" allowfullscreen></iframe>....
在您的网络视图中添加此代码。
webView.getSettings().setUserAgentString("Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");