2011-05-10 188 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

相关问题