2014-02-26 47 views
6

從我已經能夠發現,這似乎是特定於最近的三星設備。 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();仍然不停止殭屍的MediaPlayer
  • webView = 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,我想沒關係,但我需要它能夠稍後加載另一個頁面。

+3

考慮到這看起來像是需要AOSP修復程序的東西,我已經打開https://code.google.com/p/android/issues/detail?id=67605引用此問題 – Offbeatmammal

回答

1

對我來說,沒有其他的解決方案工作以外:

android.os.Process.killProcess(android.os.Process.myPid()); 

這都與你不能真正從內創建活動的麻煩,但我已經克服了第二個過程。

-1
((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)).requestAudioFocus(
        new AudioManager.OnAudioFocusChangeListener() { 
         @Override 
         public void onAudioFocusChange(int focusChange) { 
         } 
        }, AudioManager.STREAM_MUSIC, 
        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);