2011-05-10 157 views
60

如何停止在我的webview中播放的YouTube視頻?當我點擊後退按鈕時,視頻不會停止,而是在後臺繼續播放。如何停止在Android WebView中播放YouTube視頻?

代碼:

webView = (WebView) findViewById(R.id.webview); 
webView.getSettings().setPluginsEnabled(true); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.getSettings().setBuiltInZoomControls(false); 
webView.getSettings().setSupportZoom(false); 
webView.loadData(myUrl,"text/html", "utf-8"); 
+0

你可以發佈你使用的代碼嗎? – Jordan 2011-05-10 14:13:19

+0

webView =(WebView)findViewById(R.id.webview); webView.getSettings()。setPluginsEnabled(true); webView.getSettings()。setJavaScriptEnabled(true); webView.getSettings()。setBuiltInZoomControls(false); webView.getSettings()。setSupportZoom(false); webView.loadData(myUrl,「text/html」,「utf-8」); – Droid 2011-05-11 11:46:15

回答

87

見下面的帖子約WebView threads never stopping

從本質上講,你需要從自己的活動的方法的onPause調用的WebView的onPause方法。

唯一的技巧就是你不能直接調用WebView的onPause方法,因爲它是隱藏的。因此,您需要通過反射間接調用它。下面的代碼應該讓你開始設立自己的活動的的onPause方法:

@Override 
public void onPause() { 
    super.onPause(); 

    try { 
     Class.forName("android.webkit.WebView") 
       .getMethod("onPause", (Class[]) null) 
          .invoke(webview, (Object[]) null); 

    } catch(ClassNotFoundException cnfe) { 
     ... 
    } catch(NoSuchMethodException nsme) { 
     ... 
    } catch(InvocationTargetException ite) { 
     ... 
    } catch (IllegalAccessException iae) { 
     ... 
    } 
} 

注意的是,上面的try塊中的變量「網頁視圖」是一個私有的實例變量的類,並在活動的被分配到onCreate方法。

+2

我試圖把邏輯放在「後退按鍵」。但它沒有工作。這個作品 – png 2012-02-25 02:00:20

+0

謝謝!!!我正在嘗試過去8小時,沒有任何工作。但是這就像一個魅力! – dakshbhatt21 2013-09-07 14:19:50

+0

使用反射這個簡單的任務不是解決方案.. – 2014-06-03 20:59:56

14

上面的解決方案在三星Galaxy S Android 2.3.3上失敗了。 但我做了成功嘗試以下解決方法:

webview.loadUrl("file:///android_asset/nonexistent.html"); 

我強迫的WebView加載一個不存在的HTML文件。這似乎是迫使webview來清理。

+0

這對我有用!謝謝。 – 2013-07-10 18:28:13

+0

也爲我工作:-) – Jitu 2013-08-08 07:27:14

+0

謝謝你的作品 - 安卓4.3 – j2emanue 2013-09-26 23:41:59

4
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    // TODO Auto-generated method stub 
    if(keyCode==event.KEYCODE_BACK) 
    { 
     mWebview.loadUrl(""); 
     mWebview.stopLoading(); 

     finish(); 

    } 
    return super.onKeyDown(keyCode, event); 
} 

它的工作原理

+0

「mWebView」中的「m」是什麼? – Steve 2016-05-02 04:11:26

+1

@Steve它是[Android Code Style for Contributors](http://source.android.com/source/code-style.html#follow-field-naming-conventions)文檔中概述的命名約定,它代表'會員'。雖然這種代碼風格是針對Android源代碼(不一定是應用程序代碼),但許多Android應用程序開發人員已採用它。 – Bryan 2016-05-23 18:17:08

+0

@Steve,如果您使用的是Android Studio(就像Visual Studio的其他IDE一樣),它也是一個利用intellisense的好方法。當你在課堂上並輸入m時,會出現一個彈出列表菜單,其中列出了以'm'開頭的所有變量。如果你願意,你可以使用其他字母。 – 2016-08-31 03:19:52

57

解決方案:1 - 花費大量的時間後,我得到的結論暫停視頻這與HTML的網頁視圖概念玩。

只要覆蓋活動或片段上的onPause()方法,無論您使用WebView,然後調用它。這個對我有用。

@Override 
public void onPause() { 
    super.onPause(); 
    mWebView.onPause(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    mWebView.onResume(); 
} 

解決方案:2 - 如果上述方案不能爲你工作,那麼你可以強制的WebView加載一個不存在的HTML文件。

mWebview.loadUrl("file:///android_asset/nonexistent.html"); 
+1

WebView.onPause()被添加到API 11中,使得這是更正確的答案。 – 2015-05-21 22:38:48

+0

在API 19上沒有適用於我,AudioBoom嵌入式播放器繼續播放音頻。 – 2015-08-15 13:16:39

+1

@jarrodSmith嘗試'pauseTimers();'。也許它更基於JavaScript。 – Nilzor 2015-08-19 09:27:25

3

Webview.loadUrl(「about:blank」);

它也在努力

+2

......並且比onPause()更好,它在某些設備上似乎什麼都不做。 – bk138 2015-03-09 11:36:46

16

你還實行的onResume()方法或第二次不爲我工作

@Override 
public void onResume() 
{ 
    super.onResume(); 
    webView.onResume(); 
} 

@Override 
public void onPause() 
{ 
    super.onPause(); 
    webView.onPause(); 
} 
+0

這應該是比上面更好的答案。 – 2016-08-08 01:26:56

+0

另一個答案更新爲「採用」這個,對於追隨者:) – rogerdpack 2017-10-22 02:27:45

1

This作品。

@Override 
protected void onPause() { 
    super.onPause(); 
    if (wViewCampaign != null){ 
     wViewCampaign.stopLoading(); 
     wViewCampaign.loadUrl(""); 
     wViewCampaign.reload(); 
     wViewCampaign = null; 
    } 
} 
+0

這不是一個好的解決方案,因爲你可能會想要在一段時間後再次回到頁面,你期望webview處於相同的狀態當你離開它時。 – bashan 2015-09-08 06:16:21

+0

在我的應用程序中,這個解決方案正在工作,因爲我沒有回到FragmentActivity的情況。 – 2016-01-13 22:23:23

3

已經遇到了這個問題似乎在onPause可能不會做任何事情......對我來說沒有任何停止在後臺播放後。

所以我的代碼現在看起來像

@Override 
protected void onPause() { 
    mWebView.onPause(); 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    mWebView.onResume(); 
    super.onResume(); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    mWebView.saveState(outState); 
    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onDestroy() { 
    mWebView.destroy(); 
    mWebView = null;   
    super.onDestroy(); 
} 

希望它可以幫助有同樣問題的人是我

0

您可以通過使用的web視圖的方法onPause()執行方法onPause()時做

@override 
public void onPause() { 
     super.onPause(); 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 
      webview.onPause(); 
     } 
} 
  • 作品:您Activity的(Honeycomb
+0

什麼是要更新的文件名稱。它也可以用於最新的API 19-26 – Ironic 2017-08-20 04:27:08

4

下面是我個人最喜歡的:

@Override 
protected void onPause() { 
    super.onPause(); 
    if (isFinishing()) { 
     webView.loadUrl("about:blank"); 
    } else { 
     webView.onPause(); 
     webView.pauseTimers(); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    webView.resumeTimers(); 
    webView.onResume(); 
} 

它暫停,如果視圖只暫停web視圖,但將其清除,當活動結束。

這至少需要Android 3.0的 - API 11(蜂窩)

0

這是最後嘗試每本頁面提供每個代碼之後的工作。 UFF!

@Override 
protected void onPause() { 
    super.onPause(); 
    if (mWebView != null) { 
     mWebView.stopLoading(); 
     mWebView.reload(); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
} 
-1

此代碼適用於我。

@Override protected void onPause() { 
    super.onPause(); 
    wv.onPause(); 
    wv.pauseTimers(); 
} 
    @Override protected void onResume() { 
    super.onResume(); 
    wv.resumeTimers(); 
    wv.onResume(); 
} 
3

試試這個:

@Override 
public void onPause() { 
    super.onPause(); 
    myWebView.onPause(); 
    myWebView.pauseTimers(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    myWebView.resumeTimers(); 
    myWebView.onResume(); 
} 


@Override 
protected void onDestroy() { 
    myWebView.destroy(); 
    myWebView = null; 
    super.onDestroy(); 
} 
1

你可以試試這個

webView.loadUrl("javascript:document.location=document.location"); 

如果這是加載頁面是一個你可以編輯,那麼你可以寫一個JavaScript方法,其停止音頻並打電話時你想停下來。

JavaScript函數

function stopAudio(){ 
    audios=document.querySelectorAll('audio'); 
     for(i=0;i<audios.length;i++){ 
     audios[i].stop(); 
     } 
    } 

從Andorid的調用此方法

webView.loadUrl("javascript:stopAudio()"); 

如果頁面是不可編輯由你,你可以注入JS代碼

@Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     injectScriptFile(view, "js/script.js"); 

    } 

How to Inject See Here in Detail

相關問題