Android WebView HTML5视频Spawns MediaPlayer永远存在于三星S4 [发现黑客回答]

ADD*_*uid 6 video html5 android webview android-mediaplayer

从我能够找到的,这似乎特定于最近的三星设备.S4会这样做.Nexus 7不会.

如果带有WebChromeClient的WebView开始播放HTML5视频,则会创建一个MediaPlayer实例.一旦视频结束,似乎没有办法杀死MediaPlayer缺少System.exit(0).

这是我的整个MainActivity.java

package com.test.webviewtest;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;

public class MainActivity extends Activity {
    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        webView = new WebView(this);
        webView.setWebChromeClient(new WebChromeClient());
        String html = "<video width=\"320\" height=\"240\" controls autoplay>" +
                "<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...
    }

}
Run Code Online (Sandbox Code Playgroud)

自然这在清单中是必需的

<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)

一旦您单击视频,logcat就会开始吐出MediaPlayer消息,并且它永远不会停止.在播放视频时有一些有用的但在此之后,它只是记录

02-25 17:13:19.395     220-8584/? V/MediaPlayerService? [470] notify (0x51b7aa00, 3, 100, 0)
02-25 17:13:19.395    8532-8610/? V/MediaPlayer? message received msg=3, ext1=100, ext2=0
02-25 17:13:19.395    8532-8610/? V/MediaPlayer? buffering 100
02-25 17:13:19.395    8532-8610/? V/MediaPlayer? callback application
02-25 17:13:19.405    8532-8610/? V/MediaPlayer? back from callback
02-25 17:13:20.406     220-8584/? V/MediaPlayerService? [470] notify (0x51b7aa00, 3, 100, 0)
02-25 17:13:20.406    8532-8544/? V/MediaPlayer? message received msg=3, ext1=100, ext2=0
02-25 17:13:20.406    8532-8544/? V/MediaPlayer? buffering 100
02-25 17:13:20.406    8532-8544/? V/MediaPlayer? callback application
02-25 17:13:20.406    8532-8544/? V/MediaPlayer? back from callback
02-25 17:13:21.407     220-8584/? V/MediaPlayerService? [470] notify (0x51b7aa00, 3, 100, 0)
02-25 17:13:21.407    8532-8611/? V/MediaPlayer? message received msg=3, ext1=100, ext2=0
02-25 17:13:21.407    8532-8611/? V/MediaPlayer? buffering 100
02-25 17:13:21.407    8532-8611/? V/MediaPlayer? callback application
02-25 17:13:21.417    8532-8611/? V/MediaPlayer? back from callback
Run Code Online (Sandbox Code Playgroud)

而这种重复永远不会结束,直到你强行关闭或卸载或其他一些激烈的东西.我已经尝试过了:

  • webView.onPause(); 这会暂停视频,使其停止在后台播放,但不会杀死MediaPlayer.
  • webView.destroy(); 仍然没有停止僵尸MediaPlayer
  • webView = null;
  • webView = new WebView(this); 仍然不
  • finish();
  • 我也尝试了各种方法来获取WebChromeClient并销毁它,但没有任何效果.

当我尝试更多的东西时,我会更新这个列表.感谢帮助.

  • 我现在也尝试将webView重定向到非活动的非视频内容webView.loadData("hi", "text/html", null);......

没有答案

这是我能找到的最好的.如果有人有更好的解决方案,请让我知道.

为了MediaPlayer让它停下来,我告诉它去一个带有<video>指向视频之外的标签的页面.

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); 
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我在屏幕上看到一个视频播放器,当我点击播放按钮时,它会记录

02-26 12:26:37.112    220-11354/? V/MediaPlayerService? [576] notify (0x47fa92b8, 100, 1, -1004)
02-26 12:26:37.112  11264-11325/com.test.webviewtest V/MediaPlayer? message received msg=100, ext1=1, ext2=-1004
02-26 12:26:37.112  11264-11325/com.test.webviewtest E/MediaPlayer? error (1, -1004)
02-26 12:26:37.112  11264-11325/com.test.webviewtest V/MediaPlayer? callback application
02-26 12:26:37.112  11264-11325/com.test.webviewtest V/MediaPlayer? back from callback
02-26 12:26:37.122  11264-11264/com.test.webviewtest E/MediaPlayer? Error (1,-1004)
Run Code Online (Sandbox Code Playgroud)

从这一点开始,MediaPlayer似乎大部分都死了(只有一点点活着).它停止所有日志记录活动,这是期望的结果.剩下的唯一痕迹就是当你强行关闭应用程序时,你仍会看到这一点.

02-26 12:29:35.826      220-738/? V/MediaPlayerService? Client(576) destructor pid = 11264
02-26 12:29:35.836      220-738/? V/MediaPlayerService? disconnect(576) from pid 11264
02-26 12:29:35.836      220-738/? W/MediaPlayerService? native_window_api_disconnect returned an error: Broken pipe (-32)
Run Code Online (Sandbox Code Playgroud)

我很好,但真正的解决方案会很好.我显然会使用自动播放连接坏视频,因此崩溃可能发生在后台,但这就是框架.


更新2-27-14虽然这可以解决三星设备上的问题,但确实打破了其他设备,因此这不是一个好的解决方案.在其他设备(Nexus 7测试)上,此代码将使WebView对将来的任何调用都无用.当我找到更多信息时,我会更新这个.如果您永远不需要在应用程序的剩余生命周期内渲染另一个WebView,我想这没关系,但我需要它能够在以后加载另一个页面.

小智 1

对我来说,除了以下方法之外,没有其他解决方案有效:

android.os.Process.killProcess(android.os.Process.myPid());
Run Code Online (Sandbox Code Playgroud)

这会带来麻烦,您实际上无法从内部创建活动,但我已经通过第二个过程克服了这个问题。