Android 停止在三星设备上的cordova webview中无限缓冲html5视频
我正在使用Cordova(PhoneGap 3.0.0-0.14.4)构建一个跨平台的移动应用程序,Android是目标平台之一。 该应用程序的一个(主要但不仅仅)功能部分是播放视频。 我选择html5Android 停止在三星设备上的cordova webview中无限缓冲html5视频,android,cordova,android-webview,html5-video,cordova-3,Android,Cordova,Android Webview,Html5 Video,Cordova 3,我正在使用Cordova(PhoneGap 3.0.0-0.14.4)构建一个跨平台的移动应用程序,Android是目标平台之一。 该应用程序的一个(主要但不仅仅)功能部分是播放视频。 我选择html5标签作为实现视频播放器的首选方法。 这些视频由Vimeo主持。 该应用程序作为单个html文档实现,通过使用javascript更改内容来实现导航 我使用的视频标签如下所示: <video autoplay controls id="videotag"> <source
标签作为实现视频播放器的首选方法。
这些视频由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>
即使在停止播放、删除视频标签以及用户退出(挂起)应用程序后,此缓冲仍将继续。
挂起应用程序不会停止缓冲,但杀死应用程序会停止缓冲。
缓冲甚至在达到100%时都不会停止,而是明显地无限期地继续。
没有声音在后台播放,但互联网连接保持打开,电池耗尽,设备加热。
这对我们来说是一个showstopper错误,因为我们不愿意发布一个导致过热的应用程序
三星Galaxy S3的测试仪也报告了与检测到的问题类似的症状。
这个问题可能仅限于三星,因为它不会发生在HTC设备上
即使不再需要视频,MediaPlayer组件似乎也不会收到停止缓冲的消息
我尝试了以下方法,但没有成功:
- 观看完后,我已将视频标签完全从DOM中移除
- 我使用javascript通过在上调用pause()来停止播放 删除之前,请先删除视频元素
- 跟随 我尝试使用javscript清除视频标记内的src URL,然后对视频标记调用load()
- 基于对上述问题的评论,我尝试将视频标记放置在iframe中,完成后将从DOM中删除 看着
- 我已尝试将上述所有内容结合起来
- 我曾尝试将视频标签放在一个单独的页面上,该页面被导航到其他位置。这与js的单一页面不同 另外使用的模型
- 我尝试通过oEmbed使用Vimeo播放器,而不是直接使用html5视频标签
- 给出了一个可能的解决方案,但根据问题作者的评论,接受的解决方案只会停止播放音频,但不会杀死MediaPlayer
- 这似乎是一个类似的问题,但使用自定义webview而不是cordova。我不知道如何尝试将此应用于科尔多瓦
实现这一点最不丑陋的方法是什么?在为类似的事情奋斗了一天之后,我发现,通过将
WebView
发送到带有HTML5视频标签且视频url不正确的页面,可以在WebView
中崩溃MediaPlayer
。下面的示例是具有有效视频标记的主要活动。如果按play,MediaPlayer将接管并开始永远运行。。。但是,当您单击“上一步”或“主页”并离开应用程序时,会触发onPause()
,并将WebView
重定向到具有错误视频url的页面,并告知自动播放。试图播放会导致媒体播放器崩溃,瞧!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);
}
}
然后是不再MediaPlayer
logs的幸福沉默
有关更多讨论,请参阅。我可以确认这确实解决了三星设备上的问题,因此我接受您的回答。然而,您在自己的问题上评论道:“它确实会破坏其他设备,因此这不是一个好的解决方案。在其他设备(Nexus 7测试)上,此代码将使WebView对未来的任何调用都毫无用处。”,因此,我将不得不继续寻找解决方案,或者将其作为三星特定的修复方案(呃,越来越丑…)
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)