停止在三星设备上的cordova webview无限缓冲html5视频
我正在用Cordova(PhoneGap 3.0.0-0.14.4)构建一个跨平台的移动应用程序,并将Android作为目标平台之一。 应用程序功能的一部分(主要但不只是)正在播放视频。 我选择了html5 <video>
标签作为实现视频播放器的首选方法。 视频托管在Vimeo上。 该应用程序被实现为一个单一的HTML文件,其中的导航是通过使用javascript更改内容来实现的。
我使用的视频标签如下所示:
<video autoplay controls id="videotag">
<source id="videosrc" src="http://player.vimeo.com/external/..."/>
Din apparat stöder inte denna video.
</video>
只需将视频标签添加到html,即可开始播放视频。 在HTC One mini(Android 4.3)上,这个解决方案没有问题。 在Samsung Galaxy S4 mini(Android 4.2.2)上,视频也会播放,但会出现另一个问题:视频正在被MediaPlayer组件缓冲,并且此缓冲从不停止。 日志由以下消息填充,无限重复:
01-25 13:45:36.698: V/MediaPlayer(2814): message received msg=3, ext1=34, ext2=0
01-25 13:45:36.698: V/MediaPlayer(2814): buffering 34
01-25 13:45:36.698: V/MediaPlayer(2814): callback application
01-25 13:45:36.698: V/MediaPlayer(2814): back from callback
即使在播放停止后,该缓冲也会继续,视频标签被移除并且用户退出(挂起)应用程序。 暂停应用程序不会停止缓冲,但杀死该应用程序。 当达到100%时,缓冲甚至不会停止,而是显然无限期地持续下去。 没有声音在后台播放,但互联网连接保持打开状态,电池电量耗尽,设备发热 。 这对我们来说是一个惊人的bug,因为我们不愿意发布导致过热的应用程序。
三星Galaxy S3上的beta测试人员也报告了与检测到的问题类似的症状。 这个问题可能仅限于三星,因为它不会出现在HTC设备上。
即使不再需要视频,MediaPlayer组件似乎也不会收到停止缓冲的消息。
我尝试了以下方法,但没有成功:
这耗尽了我所能找到的平台独立技巧。 有一些基于原生Android代码的方法
我正在寻找解决这个问题的方法,让视频播放时不会造成过热。 这应该是其他人需要解决的问题,所以希望有一个解决问题的cordova插件。 有这样一个插件吗? 如果没有,上面提到的两种Android原生方法中的任何一种都可以在cordova中实现,他们是否可以解决问题?
潜在的解决方法是在应用暂停时终止该应用。 这是丑陋的,不符合Android指南。 实现这一目标最不丑陋的方式是什么?
在类似的事情上挣扎了一天之后,我发现您可以通过将WebView
发送到带有视频网址不佳的HTML5视频标签的页面来让MediaPlayer
在WebView
内部崩溃。 下面的例子是一个有效的视频标签的主要活动。 如果按下播放, MediaPlayer
将接管并开始永久运行......但是当您点击返回或回家并离开应用时,会触发onPause()
,并且WebView
被重定向到具有不良视频网址的页面,并被告知自动播放。 试图播放MediaPlayer
播放器崩溃,瞧! MediaPlayer
。
package com.test.webviewtest;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = new WebView(this);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
String html = "<video width="320" height="240" controls>" +
"<source src="http://www.w3schools.com/html/movie.mp4" " +
"type="video/mp4"></video>";
webView.loadData(html, "text/html", null);
setContentView(webView);
}
@Override
protected void onPause(){
super.onPause();
// attempt to kill the MediaPlayer here...
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon){
String js = "javascript:document.getElementsByTagName('video')[0].play();";
webView.loadUrl(js);
}
});
String html = "<video width="320" height="240" controls>" +
"<source src="http://www.w3schools.com/html/" +
"NOT_A_MOVIE.mp4" +
"" type="video/mp4"></video>";
webView.loadData(html, "text/html", null);
}
}
请注意日志:
02-26 13:19:13.010 220-25370/? V/MediaPlayerService﹕ [607] notify (0x43a3aeb8, 100, 1, -1004)
02-26 13:19:13.010 25262-25274/com.test.webviewtest V/MediaPlayer﹕ message received msg=100, ext1=1, ext2=-1004
02-26 13:19:13.010 25262-25274/com.test.webviewtest E/MediaPlayer﹕ error (1, -1004)
02-26 13:19:13.010 25262-25274/com.test.webviewtest V/MediaPlayer﹕ callback application
02-26 13:19:13.020 25262-25274/com.test.webviewtest V/MediaPlayer﹕ back from callback
02-26 13:19:13.020 25262-25262/com.test.webviewtest E/MediaPlayer﹕ Error (1,-1004)
然后没有更多的MediaPlayer
日志幸福的沉默...
查看Android WebView HTML5视频Spawns MediaPlayer,它永远在三星S4上生存[发现被黑黑的答案]以获得更多讨论。
链接地址: http://www.djcxy.com/p/64353.html上一篇: Stop endless buffering of html5 video in cordova webview on Samsung devices