在目前PC浏览器上,对video的支持基本都没什么问题了。但是如果用webview去跑这样的页面就会遇到许多问题。

下面一段html

 <!DOCTYPE html>
<html>
<head>
</head>
<body onload="test()">
<video id="video01" autoplay="autoplay">
<source src="mov_bbb.mp4" type="video/mp4" />
<p>no support text</p>
</video>
</body>
<script> function test() {
var video01 = document.getElementById("video01");
video01.preload = "auto";
video01.autoplay = true;
video01.loop = true;
}
</script>
</html>

用js控制视频的自动播放,循环播放等特性,在PC上都没啥问题。但是如果用webview去装载的话,自动播放和循环播放可能用不了。

在android的webview上autoplay自动播放这个特性支持跟设备有关系,和android的版本号没关系(这个试过的)。并且大多数设备都是不能自动播放的。并且loop这个特性也基本上是不支持的。

在webview经历了以下调试过程。
如果将video的controls打开,让它显示控件。点击播放控件是可以正常播放的。这个可以证明播放mp4视频本身是没有问题的。
 

如果在页面上自己添加一个按钮,通过点击按钮来调用video.play()方法,能不能播放呢。

        <div>
<button id="playBtn01">play</button>
</div>

js代码

var playBtn01 = document.getElementById("playBtn01");
playBtn01.addEventListener("click", function() {
video01.play();
});

这样是可以正常播放的。

于是便会想到能不能在某个特定的时候(例如某个事件发生,或者定时器时间到)调用video.play()方法让其自动播放呢?

修改一下代码

 function test() {

     var video01 = document.getElementById("video01");
var timer = null;
var playing = false; video01.addEventListener("playing", function() {
playing = true;
}); timer = setInterval(playInterval, 1000); function playInterval() {
if (playing === false) {
video01.play();
} else {
if (timer !== null) {
clearInterval(timer);
}
}
}
}
代码很简单,就是如果视频没有播放则不停的去调用video.play方法。如果成功了就清空js的计时器。
因为前面的按钮事件调用video.play是可以正常播放的,所以刚开始以为这个方案能成。但实际上这种方案是走不通的。
 
疑惑了许久也不知道为什么,代码都是一样的没问题。再后来才知道原因,
原来autoplay自动播放在移动设备上可能会导致很不好的用户体验,因此大多数移动设备不支持自动播放。如果要播放必须用户手工主动触发,比如点击一个按钮或者其他操作。类似setInterval此类没有用户参与过程的播放是行不通的。
 
使用setInterval或者其他非用户交互的事件来触发video的播放看起来现在是不可能了。但是有一个唯一的例外。
这个唯一的例外就是android native段的onPageFinishload方法中的回调是可以的。也就是说如果在onPageFinishload调用js来执行video.play方法则也是可以自动播放的。onPageFinishload是webview装载完内容后触发的,虽然没有用户交互但是它可以用来做自动播放。
 
修改一下android段的代码,重写WebViewClient的onPageFinished方法,利用loadUrl来执行一个js函数。
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//......
view.loadUrl("javascript:onPageFinished();");
}

在js端

function onPageFinished() {
console.log("page -- onPageFinished");
//在这里调用video.play播放便可以了
var video01 = document.getElementById("video01");
video01.play();
}

这样便可以自动播放了。

loop的问题
其实最后Loop的问题我也没有解决。不过还是愿意写出来大家看看,看有没有哪位朋友知道怎么回事。
 
因为设备很有可能不支持loop循环。但是通过上面的方法自动播放是可以了。于是想到,等到视频播放完成后的pause事件,这个事件一出来,我们将webview重新load一遍或者webview销毁重新建一个webview。等于是重头来了一遍了,重头来一遍也是自动播放。这样给人感觉就是自动loop了。
 
但这样的效果不佳,一方面是播放完成后重新load页面知道视频播放出来,中间会有间断的过程,看起来不是很连贯。
另外一个很致命的问题是,我尝试过webview销毁,重建这种循环,但是来回几次后,程序就crash掉了。这个crash原因很复杂,并且也是认机器的,所以也就不多说了。
 
总之现在移动设备对html5 的video支持的还不是很好,用起来各种各样的麻烦。最后我的项目也还是放弃了html5方式改用本地代码实现。

android webview 播放 video经验总结的更多相关文章

  1. [转]Android WebView播放视频(包括全屏播放),androidwebview

    Android WebView播放视频(包括全屏播放),androidwebview 最近项目开发中用到了WebView播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里 ...

  2. Android WebView播放视频flash(判断是否安装flash插件)

    Android WebView播放flash(判断是否安装flash插件)  最近帮一个同学做一个项目,断断续续的一些知识点记录一下.一个页面中有一个WebView,用来播放swf,如果系统中未安装f ...

  3. 【转】Android WebView 播放视频总结

    今天发现 WebView里播放优酷的视频点击播放按钮后没反应,于是看官方文档和搜索解决,下面是我在别人基础上做的补充:   android webView 无法播放视频,无法暂停,继续播放视频问题,无 ...

  4. Android 中WebView中video视频自动播放

    转载于https://juejin.im/post/5d5ac7eb51882562744fae37 如果有使用过Android的WebView 播放视频的伙伴们一定会发现, 在点开视频网页的时候并没 ...

  5. video/audio在ios/android上播放兼容

    1.audio自动播放 <audio src='xxx.mp3' autoplay></audio> 上面是audio标签autoplay属性是自动播放,但是在安卓部分浏览器和 ...

  6. 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)

    前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...

  7. Android WebView 详解

    相关API 相关类介绍 WebResourceRequest 添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向 WebResou ...

  8. WebView&HTML5-----使用WebView播放HTML5视频文件

    一.问题描述 HTML5提供了很多新的特性比如,视频播放.web本地存储.地理定位.应用缓存.Canvas等,但这些特性需要浏览器的支持,在Android应用中我们可以使用WebView构建Web应用 ...

  9. Atitit.android webview h5运行环境总结

    Atitit.android webview h5运行环境总结 1. WebView 的使用1 2. Js调用java1 3. Js调用java 跟个swt的比较2 3.1. Swt是BrowserF ...

随机推荐

  1. 转-安装vncserver

    怎样在 CentOS 7.0 上安装和配置 VNC 服务器 https://www.linuxidc.com/Linux/2015-04/116725.htm --安装完图形界面和图形管理工具之后,下 ...

  2. Django Rest Framework(阿奇)

    Django Rest Framework 一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中 ...

  3. NestJS 用TypeScript开发 nodeJS后端

    NestJS A progressive Node.js framework for building efficient and scalable server-side applications ...

  4. ubuntu16.04 安装python3.6

    https://www.cnblogs.com/yjlch1016/p/8641910.html

  5. 使用solr模拟京东搜素功能

    1 项目需求 1.可以根据关键字搜索商品 2.可以根据商品的分类和价格过滤搜索结果 3.可以根据价格排序 4.可以实现基本的分页功能 2 界面效果 3 项目环境搭建 1.创建一个动态的web工程 2. ...

  6. Hibernate各种查询操作(二)

    一.QBC的查询方式 使用QBC不在需要写hql语句,而是使用criteria对象的各种方法来实现. 1.查询所有 //使用QBC方式查询所有 @Test public void test11(){ ...

  7. Java入门系列-16-继承

    这一篇文章教给新手学会使用继承,及理解继承的概念.掌握访问修饰符.掌握 final 关键字的用法. 继承 为什么要使用继承 首先我们先看一下这两个类: public class Teacher { p ...

  8. FZU2168——防守阵地 I——————【找规律或前缀和】

    防守阵地 I Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  9. Codeforces 981F. Round Marriage

    Description 一个长度为 \(L\) 的环上有 \(n\) 个黑点和 \(n\) 个白点 , 你需要把黑点和白点配对 , 使得配对点的最大距离最小 , 最小距离定义为两点在环上的两条路径的最 ...

  10. sublime text 3支持GBK编码

    1.安装Package Control: 按Ctrl+~打开命令行,然后复制粘贴下面这一行代码,回车确定: import urllib.request,os; pf = 'Package Contro ...