Android 停止在三星设备上的cordova webview中无限缓冲html5视频

Android 停止在三星设备上的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

我正在使用Cordova(PhoneGap 3.0.0-0.14.4)构建一个跨平台的移动应用程序,Android是目标平台之一。 该应用程序的一个(主要但不仅仅)功能部分是播放视频。 我选择html5
标签作为实现视频播放器的首选方法。 这些视频由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视频标签
这耗尽了我所能找到的独立于平台的技巧。 有一些基于原生Android代码的方法

  • 给出了一个可能的解决方案,但根据问题作者的评论,接受的解决方案只会停止播放音频,但不会杀死MediaPlayer
  • 这似乎是一个类似的问题,但使用自定义webview而不是cordova。我不知道如何尝试将此应用于科尔多瓦
我正在寻找任何解决方案的问题,使视频播放,而不会造成过热。 这应该是其他人需要解决的问题,所以希望有一个cordova插件已经解决了这个问题。 有这样的插件吗? 如果没有,上述两种Android本机方法中的任何一种都可以在cordova中实现,它们会解决问题吗

一个潜在的解决方法是在应用程序挂起时将其杀死。 这很难看,而且不符合Android的指导原则。
实现这一点最不丑陋的方法是什么?

在为类似的事情奋斗了一天之后,我发现,通过将
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)