本文共 5858 字,大约阅读时间需要 19 分钟。
webView播放视频时候,会遇到一些问题,比如无法全屏播放视频等。解决方案有以下两种,这里着重介绍第二种解决方案。
手机中HTML5网页上点全屏后的效果。
需要在AndroidManifest.xml
文件中声明需要使用HardwareAccelerate
。务必强制打开硬件加速,否则只有声音没有画面,因为在Android 5的部分rom上默认关闭硬件加速的,此时需要强制打开硬件加速。
< application ... android:hardwareAccelerated ="true">
方式二:在Activity中声明:
硬件加速配置好后,添加android:configChanges
配置
webView
所在的Activity
添加如下配置,不添加无法全屏播放。 ...android:configChanges="orientation|screenSize|keyboardHidden"...
权限记得添加
webView
控件所在的xml文件内容Activity
中初始化webView
1.去掉标题,否则可能导致无法全屏;
2.初始布局中的两个控件; 3.webView一些简单初始化和配置,根据需求灵活修改;class MyActivity extends Activity { ... private FrameLayout mFrameLayout; private WebView mWebView; private InsideWebChromeClient mInsideWebChromeClient; //private JavascriptInterface javascriptInterface; private String URL = "改成自己需要测试的H5网页"; @Override protected void onCreate(Bundle saveInstanceState) { // 1 requestWindowFeature(Window.FEATURE_NO_TITLE); // 2 mFrameLayout = (FrameLayout) findViewById(R.id.mFrameLayout); mWebView = (WebView) findViewById(R.id.mWebView); // 3 initWebView(); mWebView.loadUrl(URL); } private void initWebView() { WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setPluginState(WebSettings.PluginState.ON); //settings.setPluginsEnabled(true); settings.setAllowFileAccess(true); settings.setLoadWithOverviewMode(true); settings.setUseWideViewPort(true); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); settings.setCacheMode(WebSettings.LOAD_DEFAULT); mInsideWebChromeClient = new InsideWebChromeClient(); InsideWebViewClient mInsideWebViewClient = new InsideWebViewClient(); //javascriptInterface = new JavascriptInterface(); //mWebView.addJavascriptInterface(javascriptInterface, "java2js_laole918"); mWebView.setWebChromeClient(mInsideWebChromeClient); mWebView.setWebViewClient(mInsideWebViewClient); }}
WebChromeClient
类步骤三种mInsideWebChromeClient = new InsideWebChromeClient();
初始化的是自定义的WebChromeClient
类,这里就开始创建该类
思路:在onShowCustomView
方法中,讲获取到的view
放到当前Activity
的最上方,在onHideCustomView
中,将之前的view
隐藏或者删除,将原来被覆盖的webview
放回来。并结束播放。
public Class MyActivity extends Activity { ... private class InsideWebChromeClient extends WebChromeClient { private View mCustomView; private CustomViewCallback mCustomViewCallback; @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); if (mCustomView != null) { callback.onCustomViewHidden(); return; } mCustomView = view; mFrameLayout.addView(mCustomView); mCustomViewCallback = callback; mWebView.setVisibility(View.GONE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } public void onHideCustomView() { mWebView.setVisibility(View.VISIBLE); if (mCustomView == null) { return; } mCustomView.setVisibility(View.GONE); mFrameLayout.removeView(mCustomView); mCustomViewCallback.onCustomViewHidden(); mCustomView = null; setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); super.onHideCustomView(); } } ...}
WebViewClient
,在Activity
内部类。重写WebViewClient
在onPageFinished()
方法中可以注入JS语句。按需求添加。
... private class InsideWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //mWebView.loadUrl(javascript); } }...
Activity
中复写onConfigurationChanged
方法...@Overridepublic void onConfigurationChanged(Configuration config) { super.onConfigurationChanged(config); switch (config.orientation) { case Configuration.ORIENTATION_LANDSCAPE: getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); break; case Configuration.ORIENTATION_PORTRAIT: getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); break; }}
Activity
声明周期内webView
的操作...@Overridepublic void onPause() { super.onPause(); mWebView.onPause();}@Overridepublic void onResume() { super.onResume(); mWebView.onResume();}@Overridepublic void onBackPressed() { if (mWebView.canGoBack()) { mWebView.goBack(); return; } super.onBackPressed();}@Overridepublic void onDestroy() { mWebView.destroy(); super.onDestroy();}...
思路:在onShowCustomView
方法中,讲获取到的view
放到当前Activity
的最上方,在onHideCustomView
中,将之前的view
隐藏或者删除,将原来被覆盖的webview
放回来。并结束播放。
点击全屏按钮后,宽度拉宽了,高度也高了,但是可以上下滑动,看起来像是一个横屏的网页,这是伪全屏。
AndroidManifest.xml
清单文件, WebView
控件所在的 Activity
配置信息是否添加 android:configChanges
或者是否 orientation
, screenSize
, keyboardHidden
写全了。我之前就是忘记写了个 screenSize
参数,点击视频全屏按钮后,是一个伪全屏。还可以上下滑动呢。 ## 犯错的错误写成了如下:android:configChanges="orientation|keyboardHidden" -->## 正确的写法:android:configChanges="orientation|screenSize|keyboardHidden"
2.检查Activity
的主题是否NoActionBar
了。
打开搜狐,播放一个视频,查看源代码,查找以下代码,url就是html5。
不懂得可以简书私信我,我会在第一时间回复。
转载地址:http://vgcio.baihongyu.com/