最近项目中遇到WebView 播放视频需求(H5 video 标签),那么问题来了视频无法全屏播放等。

对于这种视频播放问题有多种方案可以解决,例如:

1.实现一个网络视频播放器来播放网络视频(这个方案如果不利用开源的框架,实现起来费时费力)

2.自定义WebView实现利用H5的Video标签来播放视频(可以解决基本的视频播放需求,但是可能很多效果难以实现,比如手势控制等)

下面介绍第二种解决方案:

需要我们自定义WebView 来实现。

分步指南

  1. 新建一个Activity 来播放视频( PlayVideoWebViewActivity) 
    这个activity的布局非常简单,就是一个简单的 WebView,布局文件如下:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/container"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical">
    
     <FrameLayout
     android:id="@+id/video_view"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:visibility="gone">
    
     </FrameLayout>
    
     <WebView
     android:id="@+id/video_webview"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"/>
    
     <ImageView
     android:id="@+id/goback"
     android:layout_width="45dp"
     android:layout_height="45dp" />
    </FrameLayout>
    

    可以看到布局文件中除了一个WebView 还有一个 FrameLayout  id/video_view,这个FrameLayout 其实就是我们用来解决全屏播放的。

  2. 初始化View
    private void initwidget() {
    // TODO Auto-generated method stub
     videoview = (FrameLayout) findViewById(R.id.video_view);
     videowebview = (WebView) findViewById(R.id.video_webview);
     back = (ImageView) findViewById(R.id.goback) ;
     back.setOnClickListener(new Listener());
     WebSettings ws = videowebview.getSettings();
     /**
     *
     * setAllowFileAccess 启用或禁止WebView访问文件数据 setBlockNetworkImage 是否显示网络图像
     * setBuiltInZoomControls 设置是否支持缩放 setCacheMode 设置缓冲的模式
     * setDefaultFontSize 设置默认的字体大小 setDefaultTextEncodingName 设置在解码时使用的默认编码
     * setFixedFontFamily 设置固定使用的字体 setJavaSciptEnabled 设置是否支持Javascript
     * setLayoutAlgorithm 设置布局方式 setLightTouchEnabled 设置用鼠标激活被选项
     * setSupportZoom 设置是否支持变焦
     * */
     ws.setBuiltInZoomControls(true);// 隐藏缩放按钮
     ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 排版适应屏幕
     ws.setUseWideViewPort(true);// 可任意比例缩放
     ws.setLoadWithOverviewMode(true);// setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。
     ws.setSavePassword(true);
     ws.setSaveFormData(true);// 保存表单数据
     ws.setJavaScriptEnabled(true);
     ws.setGeolocationEnabled(true);// 启用地理定位
     ws.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");// 设置定位的数据库路径
     ws.setDomStorageEnabled(true);
     mWebchromeclient = new mWebChromeClient();
     videowebview.setWebChromeClient(mWebchromeclient);
     videowebview.setWebViewClient(new xWebViewClientent());
    
    }
  3. 下面重点来了
    自定义 mWebChromeClient 继承 WebChromeClient。实现对全屏操作的处理,及默认播放图标,Html 页面标题等。

    /**
     * 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等
     *
     * @author
     **/
     public class mWebChromeClient extends WebChromeClient {
    private Bitmap xdefaltvideo;
     private View xprogressvideo;
    
     @Override
     //播放网络视频时全屏会被调用的方法
     public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) {setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
     videowebview.setVisibility(View.GONE);
     //如果一个视图已经存在,那么立刻终止并新建一个
     if (xCustomView != null) {callback.onCustomViewHidden();
     return;
     }
    videoview.addView(view);
     xCustomView = view;
     xCustomViewCallback = callback;
     videoview.setVisibility(View.VISIBLE);
     }@Override
     //视频播放退出全屏会被调用的
     public void onHideCustomView() {
    if (xCustomView == null)//不是全屏播放状态
     return;
     // Hide the custom view.
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
     xCustomView.setVisibility(View.GONE);
     // Remove the custom view from its container.
     videoview.removeView(xCustomView);
     xCustomView = null;
     videoview.setVisibility(View.GONE);
     xCustomViewCallback.onCustomViewHidden();
     videowebview.setVisibility(View.VISIBLE);
     }// //视频加载添加默认图标
    // @Override
    // public Bitmap getDefaultVideoPoster() {
    // //Log.i(LOGTAG, "here in on getDefaultVideoPoster");
    // if (xdefaltvideo == null) {
    // xdefaltvideo = BitmapFactory.decodeResource(getResources(), R.drawable.seach_icon);
    // }
    // return xdefaltvideo;
    // }
    
     //视频加载时进程loading
    // @Override
    // public View getVideoLoadingProgressView() {
    // //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");
    // if (xprogressvideo == null) {
    // LayoutInflater inflater = LayoutInflater.from(PlayVideoWebViewActivity.this);
    // xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null);
    // }
    // return xprogressvideo;
    // }
    
     //网页标题
     @Override
     public void onReceivedTitle(WebView view, String title) {(PlayVideoWebViewActivity.this).setTitle(title);
     }}
  4. 实现横竖屏切换
    /**
     * * 当横竖屏切换时会调用该方法
     * * @author
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {Log.i("testwebview", "=====<<< onConfigurationChanged >>>=====");
     super.onConfigurationChanged(newConfig);
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {Log.i("webview", " 现在是横屏1");
     islandport = false;
     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {Log.i("webview", " 现在是竖屏1");
     islandport = true;
     }
    }
  5. 添加按键监听,实现音量+/-,实现全屏模式下返回退出全屏,实现退出播放操作等。
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
     int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    
     if (keyCode == KeyEvent.KEYCODE_BACK) {
    if (inCustomView()) {hideCustomView();
     return true;
     } else {
    videowebview.loadUrl("about:blank");
     videowebview = null;
     this.finish();
     }}if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){//音量+
     mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume+1, 1);
     }
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){//音量-
     mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume-1, 1);
     }
    return true;
    }
    /**
     * 判断是否是全屏
     *
     * @return
     */
    public boolean inCustomView() {return (xCustomView != null);
    }/**
     * 全屏时按返加键执行退出全屏方法
     */
    public void hideCustomView() {mWebchromeclient.onHideCustomView();
    }

    上面可以看到返回退出播放时webview加载了一个空白页面,这样做的目的是如果不加载空白页面,会出现界面退出了但是声音还存在,也就没有回收资源。

  6. 实现全屏,去掉应用标题及手机状态栏
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
     requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉应用标题
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
     setContentView(R.layout.activity_play_video_web_view);
     //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
     initwidget();
     url = getIntent().getStringExtra("url");
     videowebview.loadUrl(url);
    }
  7. 完整类文件http://download.csdn.net/detail/qq1805812268/9515793
  8. 号外:
    1.该Activity要允许横屏
    
    <activity
        android:name=".guide.activity.PlayVideoWebViewActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        >
    2.硬件加速
    android:hardwareAccelerated="true"

Android WebView 视频播放解决相关推荐

  1. Android WebView 视频播放,全屏按钮不显示或灰显解决方案

    Android WebView 视频播放,全屏按钮不显示或灰显解决方案 背景 问题定位 背景 在Android开发中,遇到了如下问题:Activity内嵌WebView,加载有视频的页面时,视频无法全 ...

  2. android WebView多标签,加速解决卡顿,视频播放笔记

    android硬件加速 android:hardwareAccelerated="true" WebView控件加速配置 //加速丝滑getBinding().web.setLay ...

  3. android资源加载失败,解决Android WebView拦截url,视频播放加载失败的问题

    解决Android WebView拦截url,视频播放加载失败的问题 发布时间:2020-10-08 05:19:44 来源:脚本之家 阅读:86 作者:灵均子孟 需求:Android调用webVie ...

  4. Android webview 写入cookie的解决方法以及一些属性设置

    Android webview 写入cookie的解决方法以及一些属性设置 参考文章: (1)Android webview 写入cookie的解决方法以及一些属性设置 (2)https://www. ...

  5. android webview file,Android WebView 不支持 H5 input type=file 解决方法

    最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中.发现点击H5中 input type="file" 标签 不能打开android资源管理器 ...

  6. android 服务器返回302,Android WebView 内处理302重定向不跳转的解决

    最近项目中Webview加载第三方的具有302的重定向,但是却发现却没有重新跳转.最后发现问题如下: public boolean shouldOverrideUrlLoading(WebView v ...

  7. android webview 设置cookie时间,解决Android webview设置cookie和cookie丢失的问题

    Android页面嵌套了一个h5,H5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败.和web那边商量一会,发现js写入的cookie丢失了.所有需要Android这边在重写写入 ...

  8. android——webview解决goback()后,界面会刷新的问题

    android--webview解决goback()后,界面会刷新的问题 参考文章: (1)android--webview解决goback()后,界面会刷新的问题 (2)https://www.cn ...

  9. android默认视频播放器,WebView不打开android默认视频播放器?

    当我在我的android设备的默认网页浏览器上查看this page并点击第一个视频时,它会触发我设备的默认视频播放器.它加载和播放.WebView不打开android默认视频播放器? 但是,当我在我 ...

最新文章

  1. 古塔问题matlab,基于 Matlab 对古塔变形趋势探究的数学模型
  2. Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议
  3. 基本ACL与高级ACL
  4. 演讲 | 微软亚洲研究院刘铁岩:对偶学习推动人工智能的新浪潮
  5. 计算机网络技术发源于什么,计算机网络基础试题和答案
  6. “智慧灯杆”的应用和解决方案
  7. 字符串替换方法的优劣
  8. I/O多路转换 select
  9. 7_python基础—while循环应用1-100累加和
  10. linux关闭cups命令,使用linux的cupsenable命令启动指定的打印机
  11. 天池实验室-Task02-Python入门(中)
  12. PXE安装报错:Cant' write to /dev/sda ,because it is opened read-only
  13. .obj格式的文件怎么显示在html_怎么才能把安卓手机备忘录便签里的文件转到苹果上?...
  14. 转:在windows中将tree命令加入git-bash中
  15. 大智慧加密指标源码恢复,指标破解工具
  16. 关于高通平台9008线刷的一些注意点,供小白食用。
  17. GIS | 坐标系统与地图投影
  18. TAOCP中1.1习题1解答与思考
  19. python - 啃书 第八章 正则表达式
  20. Java高级 正向代理和反向代理理解

热门文章

  1. 视频抓图(有硬编码解码)一获得解码后数据
  2. can波特率及总线占有率计算
  3. 亚马逊雨林大火为何上不了热搜?我们都被某些媒体给忽悠了!
  4. SQL把一个表中数据更新到另一个表的多种方法
  5. Unity Unet(四)多人在线游戏框架
  6. 基于微信小程序美食攻略点评小程序毕业设计设计与实现毕设开题参考
  7. 第一次亲密接触IT技术(第一天)
  8. 计算机系的对联,首个计算机对联系统问世
  9. 【华人学者风采】林学民 新南威尔士大学
  10. JavaScript 个人笔记3(详细BOMDOM)