问题描述:

在项目中,会有在webview嵌入的网页中播放视频的需求,本来以为Android的WebView应该是默认支持视频播放的,不会有太大的问题,但是经过测试后,发现两个大问题:

有些手机无法正常播放视频,出现白屏或者只有声音没有画面等,还有不能对视频进行操作(比如播放、暂停、自动播放等)

视频无法全屏播放

视频在webview中正常播放:

这个只需要在对应的Activity中加入android:hardwareAccelerated="true"即可,如果不加的话,会在部分手机上出现白屏或有声音无画面等问题。还有不能对视频进行操作(比如播放、暂停、自动播放等)。

application和activity可直接在 AndroidManifest.xml 中添加该属性:

// 在application中

// 在activity中

也可在代码中设置:

// 在代码中

getWindow.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

注意:一定不要忘记加网络权限!

横竖屏播放:

webview加载视频网页的时候会遇到无法横屏的问题,此问题需要自己重新定义设置webview里面横竖屏布局。需要重写WebView的 WebChromeClient 的 onShowCustomView() 和 onHideCustomView() 方法就可以了。大概思路是:在 onShowCustomView() 中隐藏 WebView,并将得到的 View 添加到 FrameLayout 中显示,同时切换回横屏。在 onHideCustomView() 中隐藏 View,显示 WebView,同时切换回竖屏。具体代码如下:

private WebView web_show;

private WebSettings mWebSettings;

/**

* 视频全屏参数

*/

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

private View customView;

private FrameLayout fullscreenContainer;

private WebChromeClient.CustomViewCallback customViewCallback;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_webvideo);

web_show = findViewById(R.id.web_show);

initWebView();

}

/**

* 展示网页界面

**/

private void initWebView() {

mWebSettings = web_show.getSettings();

mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);//设置js可以直接打开窗口,如window.open(),默认为false

mWebSettings.setJavaScriptEnabled(true);//是否允许JavaScript脚本运行,默认为false。设置true时,会提醒可能造成XSS漏洞

mWebSettings.setSupportZoom(true);//是否可以缩放,默认true

mWebSettings.setBuiltInZoomControls(true);//是否显示缩放按钮,默认false

mWebSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放。大视图模式

mWebSettings.setLoadWithOverviewMode(true);//和setUseWideViewPort(true)一起解决网页自适应问题

mWebSettings.setAppCacheEnabled(true);//是否使用缓存

mWebSettings.setDomStorageEnabled(true);//开启本地DOM存储

mWebSettings.setLoadsImagesAutomatically(true); // 加载图片

mWebSettings.setMediaPlaybackRequiresUserGesture(false);//播放音频,多媒体需要用户手动?设置为false为可自动播放

mWebSettings.setAllowFileAccess(true); // 允许访问文件

web_show.loadUrl("http://liveshare.huya.com/iframe/swissski");

//设置不用系统浏览器打开,直接显示在当前Webview

web_show.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return true;

}

});

web_show.setWebChromeClient(new WebChromeClient() {

/*** 视频播放相关的方法 **/

@Override

public View getVideoLoadingProgressView() {

FrameLayout frameLayout = new FrameLayout(HelloActivity.this);

frameLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));

return frameLayout;

}

@SuppressLint("SourceLockedOrientationActivity")

@Override

public void onShowCustomView(View view, CustomViewCallback callback) {

showCustomView(view, callback);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//播放时横屏幕,如果需要改变横竖屏,只需该参数就行了

}

@SuppressLint("SourceLockedOrientationActivity")

@Override

public void onHideCustomView() {

hideCustomView();

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//不播放时竖屏

}

});

}

/**

* 视频播放全屏

**/

private void showCustomView(View view, WebChromeClient.CustomViewCallback callback) {

// if a view already exists then immediately terminate the new one

if (customView != null) {

callback.onCustomViewHidden();

return;

}

this.getWindow().getDecorView();

FrameLayout decor = (FrameLayout) getWindow().getDecorView();

fullscreenContainer = new FullscreenHolder(HelloActivity.this);

fullscreenContainer.addView(view, COVER_SCREEN_PARAMS);

decor.addView(fullscreenContainer, COVER_SCREEN_PARAMS);

customView = view;

setStatusBarVisibility(false);

customViewCallback = callback;

}

/**

* 隐藏视频全屏

*/

private void hideCustomView() {

if (customView == null) {

return;

}

setStatusBarVisibility(true);

FrameLayout decor = (FrameLayout) getWindow().getDecorView();

decor.removeView(fullscreenContainer);

fullscreenContainer = null;

customView = null;

customViewCallback.onCustomViewHidden();

web_show.setVisibility(View.VISIBLE);

}

/**

* 全屏容器界面

*/

static class FullscreenHolder extends FrameLayout {

public FullscreenHolder(Context ctx) {

super(ctx);

setBackgroundColor(ctx.getResources().getColor(android.R.color.black));

}

@Override

public boolean onTouchEvent(MotionEvent evt) {

return true;

}

}

private void setStatusBarVisibility(boolean visible) {

int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;

getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

@Override

protected void onDestroy() {

super.onDestroy();

web_show.stopLoading();

web_show.setWebChromeClient(null);

web_show.setWebViewClient(null);

web_show = null;

}

本文地址:https://blog.csdn.net/Cheng_aiyun/article/details/111951466

android webview全屏时自动切换横屏,安卓 webview播放视频及横屏相关推荐

  1. ImmersionBar篇Android实现全屏配置 自动横屏

    ImmersionBar篇Android实现全屏配置 自动横屏 项目下的gradle配置添加 // 基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:i ...

  2. html5全屏幻灯片自动切换,html5特效-全屏幻灯片切换动画,支持拖拽

    html5全屏幻灯片切换动画的特效,支持拖拽,完整源码下载地址: http://pan.baidu.com/s/1nvwcLxJ 密码: dmgr 效果预览图如下: 全屏幻灯片切换动画,支持拖拽 in ...

  3. android webView 全屏播放网络视频

    1.webView播放网络视频时,有些视频源点击全屏时无反应,经过反复查验探索,原因是某些厂商写的页面不规范导致. 通过阅读官方文档得知  应用如果需要支持HTML5的video标签,必须打开硬件加速 ...

  4. WebView中点击全屏时的视频图像变形问题

    编者:李国帅 qq:9611153 微信lgs9611153 时间:2021/1/14 背景: 在android10中,打开h5页面,页面中有video视频元素,使用系统自身的全屏功能,发现打开后视频 ...

  5. Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题

    Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题 参考文章: (1)Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题 ...

  6. android studio多媒体播放器,Android支持全屏、小窗口的视频播放器

    NiceVieoPlayer Android支持全屏.小窗口的视频播放器,完美实现全屏.小窗口播放切换 Features 用IjkPlayer/MediaPlayer + TextureView封装, ...

  7. android 浏览器全屏显示

    业务需求:浏览器设置中支持全屏显示的功能.  分析:只需要在设置界面上增加是否全屏的checkBox , 然后 BrowserActivity 中读取这个值, 来设置窗口的 Style.  修改: 1 ...

  8. android强制全屏_如何强制任何Android应用进入全屏浸入模式(无生根)

    android强制全屏 Google released an Android version of Chrome in 2012, and have never bothered to give it ...

  9. android x5全屏白色,x5webview 自定义全屏界面 X5webview完美去掉分享功能和缓存功能(2)...

    privateIX5WebChromeClient.CustomViewCallback xCustomViewCallback;private FrameLayout video_fullView; ...

最新文章

  1. ubuntu 14.04 vim install youcompleteme
  2. Sublime Text 安装插件的方法
  3. 前端设计模式责任链模式
  4. 服务器端打开excel 检索 COM 类工厂 错误: 80070005
  5. netfilter与用户空间通信
  6. 【python】见过if else组合,但是你见过for else组合吗?
  7. expr命令的一些用法
  8. 网络拓扑图js插件——jTopo应用
  9. 《黑客帝国》观后感之我所理解的地球矩阵
  10. luminex细胞因子检测
  11. 保持numlock处于开启状态
  12. 看雪学院将举办《安全开发者峰会》,有这11个安全议题
  13. linu上传下载命令
  14. 听说CDN高防和高防IP是服务器安全的“翘楚”,那么你知道这二者的区别吗?
  15. php 完成时钟,PHP 绘制时钟 高洛峰 细说PHP
  16. 关于gradle项目中使用queryDsl生成Q类的问题的解决方式
  17. 「Corn #12」梦回高中
  18. 初识Tableau—(保姆级教程)
  19. Android 如何清空 Canvas 清屏只需三句话
  20. 9个加薪小秘诀 教你怎么让领导主动给你加工资

热门文章

  1. 策略模式 — 孔明排兵布阵
  2. 附加3 Merging Linked Lists (25 分)
  3. 阿里中台(看图不说话)
  4. 企微SCRM软件群积分功能,助力企业精细化运营私域
  5. C代码实现将一颗树转换成二叉树(给定树)
  6. MongoDB 初识
  7. Mysql binlog_order_commits
  8. 韩媒表示Do Kwon疑每月通过LUNA2.0获310万美元质押收益
  9. android设置水平布局,Android开发借助LinearLayout实现垂直水平居中布局
  10. Vant Weapp 0.5.11 发布,有赞小程序 UI 组件库