据我所知,这似乎是最近的三星设备特有的。 S4将做到这一点。 Nexus 7 不会。
如果带有 WebChromeClient 的 WebView 开始播放 HTML5 视频,它会创建一个 MediaPlayer 实例。一旦视频结束,似乎没有办法在 System.exit(0) 之外杀死 MediaPlayer。
这是我的整个 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...
}
}
当然,这是清单中所要求的
<uses-permission android:name="android.permission.INTERNET"/>
一旦您单击视频,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
并且这种重复永远不会结束,直到您强行关闭或卸载或其他剧烈的事情为止。
我已经尝试过:
-
webView.onPause();
这会暂停视频,使其停止在后台播放,但不会终止 MediaPlayer。
-
webView.destroy();
仍然无法阻止僵尸 MediaPlayer
-
webView = null;
nope
-
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);
当我这样做时,我会在屏幕上看到一个视频播放器,当我单击播放按钮时,它会记录
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)
从此时起,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)
我对此表示同意,但真正的解决方案会很好。显然,我会将不良视频与自动播放连接起来,这样崩溃就可能在后台发生,但这就是框架。
更新 2-27-14
虽然这“解决”了三星设备上的问题,但它确实破坏了其他设备,因此这不是一个好的解决方案。在其他设备上(已测试 Nexus 7),此代码将使 WebView 对任何未来的调用都无用。当我找到更多信息时,我会更新此内容。如果您在应用程序的剩余生命周期中永远不需要渲染另一个 WebView,我想那没问题,但我需要它能够稍后加载另一个页面。