Android WebView 播放视频 实现横屏全屏播放

小灰灰 2022-05-21 11:47 580阅读 0赞

用webiew播放视频时,要想点击全屏按钮实现全屏播放,播放腾讯视频和播放其他视频的机制不同,针对这两种机制,下面分别给出横屏全屏播放的方法。

(一)全屏播放腾讯视频(需要用到js注入)

  1. //webView显示的网页url
  2. protected void setUrl(WebView webView, String url, ProgressBar pb){
  3. webView.loadUrl(url);
  4. webView.addJavascriptInterface(new JsObject(KnowledgeVideoDetailAty4.this), "FULLSCREEN");
  5. webView.setWebViewClient(new WebViewClient() {
  6. @Override
  7. public void onPageFinished(WebView view, String url) {
  8. view.loadUrl(BrowserJsInject.fullScreenByJs(url));
  9. }
  10. /**
  11. * 设置全屏
  12. */
  13. private void setFullScreen() {
  14. runOnUiThread(new Runnable() {
  15. @Override
  16. public void run() {
  17. if (!island) {
  18. // 切换成横屏
  19. potraitToland();
  20. }else{
  21. // 切换成竖屏
  22. landToPotrait();
  23. }
  24. }
  25. });
  26. }
  27. });
  28. webView.setWebChromeClient(new WebViewClients());
  29. //支持App内部javascript交互
  30. webView.getSettings().setJavaScriptEnabled(true);
  31. //自适应屏幕
  32. webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
  33. webView.getSettings().setLoadWithOverviewMode(true);
  34. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
  35. webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
  36. }
  37. }
  38. private class WebViewClients extends WebChromeClient {
  39. public void onProgressChanged(WebView view, int progress) {
  40. //循环注入
  41. if(progress>=20){
  42. video_view.loadUrl(BrowserJsInject.fullScreenByJs(videopath));
  43. }
  44. }
  45. }
  46. /**
  47. * 设置全屏
  48. */
  49. private void setFullScreen() {
  50. runOnUiThread(new Runnable() {
  51. @Override
  52. public void run() {
  53. if (!island) {
  54. // 切换成横屏
  55. potraitToland();
  56. }else{
  57. // 切换成竖屏
  58. landToPotrait();
  59. }
  60. }
  61. });
  62. }
  63. //横屏转竖屏
  64. private void landToPotrait(){
  65. // 切换成竖屏
  66. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  67. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) video_view.getLayoutParams();
  68. //修改布局中的height,width属性
  69. //这里解释一下,因为你的手机横放过来了,所以,webview的高度其实是你手机的宽度,以此类推
  70. params.width = width;
  71. params.height = videoHeight;
  72. //重新设置修改后的布局给控件
  73. rl_video.setLayoutParams(params);
  74. video_view.setLayoutParams(params);
  75. island=false;
  76. }
  77. //竖屏转横屏
  78. private void potraitToland(){
  79. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  80. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) video_view.getLayoutParams();
  81. //修改布局中的height,width属性
  82. //这里解释一下,因为你的手机横放过来了,所以,webview的高度其实是你手机的宽度,以此类推
  83. params.width = height;
  84. params.height = width;
  85. //重新设置修改后的布局给控件
  86. rl_video.setLayoutParams(params);
  87. video_view.setLayoutParams(params);
  88. island = true;
  89. }
  90. /**
  91. * 设置监听事件
  92. * 处理各种通知、请求等事件
  93. * @author
  94. */
  95. public class JsObject {
  96. Context mContext;
  97. JsObject(Context c) {
  98. mContext = c;
  99. }
  100. @JavascriptInterface
  101. public void eventFun(){
  102. setFullScreen();
  103. }
  104. }
  105. DisplayMetrics metric = new DisplayMetrics();
  106. getWindowManager().getDefaultDisplay().getMetrics(metric);
  107. width = metric.widthPixels; // 屏幕宽度(像素)
  108. height = metric.heightPixels; // 屏幕高度(像素)

BrowserJsInject.xml文件:

  1. public class BrowserJsInject {
  2. /**
  3. * Js注入
  4. * @param url 加载的网页地址
  5. * @return 注入的js内容,若不是需要适配的网址则返回空javascript
  6. */
  7. public static String fullScreenByJs(String url){
  8. String refer = referParser(url);
  9. if (null != refer) {
  10. String js3="window.οnlοad=function(){document.getElementsByClassName('"
  11. + referParser(url) + "')[0].addEventListener('click',function(){window.FULLSCREEN.eventFun()})}"
  12. + ";";
  13. // String js3="window.οnlοad=function(){document.getElementsByClassName('"
  14. // + referParser(url) + "')[0].addEventListener('click',function(){alert('123')})}"
  15. // + ";";
  16. return "javascript:"+js3;
  17. }else {
  18. return "javascript:";
  19. }
  20. }
  21. /**
  22. * 对不同的视频网站分析相应的全屏控件
  23. * @param url 加载的网页地址
  24. * @return 相应网站全屏按钮的class标识
  25. */
  26. public static String referParser(String url){
  27. if (url.contains("letv")) {
  28. return "hv_ico_screen"; //乐视Tv
  29. }else if (url.contains("youku")) {
  30. return "x-zoomin";//优酷
  31. }else if (url.contains("bilibili")) {
  32. return "icon-widescreen"; //bilibili
  33. }else if (url.contains("qq")) {
  34. return "tvp_fullscreen_button"; //腾讯视频
  35. }
  36. return null;
  37. }
  38. }

至此实现了腾讯视频的全屏播放。

(二)优酷等其他视频的全屏播放

  1. //webView显示的网页url
  2. protected void setUrl(WebView webView, String url, ProgressBar pb){
  3. webView.loadUrl(url);
  4. webView.addJavascriptInterface(new JsObject(KnowledgeVideoDetailAty4.this), "FULLSCREEN");
  5. webView.setWebViewClient(new WebViewClient() {
  6. @Override
  7. public void onPageFinished(WebView view, String url) {
  8. view.loadUrl(BrowserJsInject.fullScreenByJs(url));
  9. }
  10. webView.setWebChromeClient(new WebViewClients());
  11. //支持App内部javascript交互
  12. webView.getSettings().setJavaScriptEnabled(true);
  13. //自适应屏幕
  14. webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
  15. webView.getSettings().setLoadWithOverviewMode(true);
  16. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
  17. webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
  18. }
  19. }
  20. private class WebViewClients extends WebChromeClient {
  21. @Override
  22. public void onShowCustomView(View view, CustomViewCallback callback) {
  23. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  24. videoContainer.setVisibility(View.VISIBLE);
  25. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) video_view.getLayoutParams();
  26. //修改布局中的height,width属性
  27. //这里解释一下,因为你的手机横放过来了,所以,webview的高度其实是你手机的宽度,以此类推
  28. params.width = height;
  29. params.height = width;
  30. //重新设置修改后的布局给控件
  31. view.setLayoutParams(params);
  32. videoContainer.addView(view);
  33. mCallBack=callback;
  34. super.onShowCustomView(view, callback);
  35. }
  36. @Override
  37. public void onHideCustomView() {
  38. // 切换成竖屏
  39. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  40. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) video_view.getLayoutParams();
  41. //修改布局中的height,width属性
  42. //这里解释一下,因为你的手机横放过来了,所以,webview的高度其实是你手机的宽度,以此类推
  43. params.width = width;
  44. params.height = videoHeight;
  45. //重新设置修改后的布局给控件
  46. rl_video.setLayoutParams(params);
  47. video_view.setLayoutParams(params);
  48. if (mCallBack!=null){
  49. mCallBack.onCustomViewHidden();
  50. }
  51. videoContainer.removeAllViews();
  52. videoContainer.setVisibility(View.GONE);
  53. super.onHideCustomView();
  54. }
  55. }

发表评论

表情:
评论列表 (有 0 条评论,580人围观)

还没有评论,来说两句吧...

相关阅读