從我已經能夠發現,這似乎是特定於最近的三星設備。 S4會這樣做。 Nexus 7不會。Android WebView HTML5視頻產生在三星S4上永遠活着的MediaPlayer [黑客找到的答案]
如果帶有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...
}
}
自然這個清單中的
<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();
仍然不停止殭屍的MediaPlayerwebView = null;
沒了webView = new WebView(this);
仍然沒了finish();
- 我也試着得到WebChromeClient的保持和摧毀它的各種方式,但沒有作品。
我會更新這個列表,因爲我會嘗試更多的東西。感謝幫助。
- 現在我也試着重定向webView的非視頻內容
webView.loadData("hi", "text/html", null);
還活着...
HACKED ANSWER
嗯,這是我能找到的最好。如果有人有更好的解決方案,請讓我知道。
爲了讓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)
我很好,但真正的解決方案會很好。顯然,我會使用自動播放功能將不良視頻連接起來,以便在後臺發生崩潰,但這就是框架。
UPDATE 14年2月27日 這枚「修復」的三星設備的問題,它中斷其他設備,所以這不是一個很好的解決方案。在其他設備上(測試Nexus 7),此代碼將使WebView對將來的呼叫無用。我會在找到更多信息時更新此信息。如果你永遠不需要爲應用的其餘部分渲染另外一個WebView,我想沒關係,但我需要它能夠稍後加載另一個頁面。
考慮到這看起來像是需要AOSP修復程序的東西,我已經打開https://code.google.com/p/android/issues/detail?id=67605引用此問題 – Offbeatmammal