如何在Android webview中停止播放YouTube视频?

问题描述 投票:62回答:16

如何停止在我的网页浏览中播放的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");
android video webview youtube
16个回答
88
投票

请参阅以下有关WebView threads never stopping的文章

基本上你需要从你自己的Activity的onPause方法调用WebView的onPause方法。

唯一的技巧是你不能直接调用WebView的onPause方法,因为它是隐藏的。因此,您需要通过反射间接调用它。以下代码可以帮助您开始设置自己的Activity的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块中的变量“webview”是类的私有实例变量,并在Activity的onCreate方法中赋值。


2
投票

你可以试试这个

@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);
}

如果正在加载的页面是您可以编辑的页面,那么您可以编写一个javascript方法来停止音频并在您想要停止时调用。

Javascript功能

@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();
}

来自Android调用此方法

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

如果你不能编辑页面,你可以注入js代码

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

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


1
投票

@Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); injectScriptFile(view, "js/script.js"); } 为我工作。

How to Inject See Here in Detail

0
投票

你可以使用你的This的方法@Override protected void onPause() { super.onPause(); if (wViewCampaign != null){ wViewCampaign.stopLoading(); wViewCampaign.loadUrl(""); wViewCampaign.reload(); wViewCampaign = null; } } 执行WebView的方法onPause()来实现:

onPause()
  • 适用于Activity@override public void onPause() { super.onPause(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ webview.onPause(); } }

0
投票

这是在尝试本页面提供的每个代码后最终工作的内容。 UFF!

API >= 11

0
投票

上面的方法对我不起作用,一个对我有用的方法是:

Honeycomb

0
投票

我尝试了以上所有答案,但大多数都不适合我。所以我只想编写自己的解决方案,在webview中播放的所有类型的媒体中都能正常工作

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

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

0
投票

在我的情况下,播放器在WebView为“onPause”后继续运行。所以我在播放视频或音乐之前检查WebView是否附加到窗口。

用于检查WebView的“isAttachedToWindow()”的JavaScriptInterface方法返回true / false。

(而且我没有忘记在Activity / Fragment中调用onPause / onResume。)


-1
投票

这段代码非常适合我。

@Override
protected void onPause() {
    super.onPause();
    ((AudioManager)getSystemService(
            Context.AUDIO_SERVICE)).requestAudioFocus(
                    new OnAudioFocusChangeListener() {
                        @Override
                        public void onAudioFocusChange(int focusChange) {}
                    }, AudioManager.STREAM_MUSIC, 
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
}

68
投票

解决方案:1 - 花了很多时间后,我得出结论暂停正在播放HTML的WebView <iframe>概念的视频。

只要在你使用qazxsw poi的地方覆盖Activity或Fragment上的qazxsw poi方法,并调用它。这个对我有用。

onPause()

解决方案:2 - 如果上述解决方案对您不起作用,则可以强制WebView加载不存在的html文件。

WebView

17
投票

你还必须实现onResume()方法或第二次它不起作用

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

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

15
投票

上面的解决方案在三星Galaxy S和Android 2.3.3上失败了。但我尝试以下解决方法取得了成功:

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

我强迫webview加载一个不存在的html文件。这似乎迫使webview清理。


6
投票

试试这个:

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

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

5
投票

这是我个人的最爱:

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

如果视图仅暂停,它会暂停webview,但在活动结束时将其清除。

这需要至少Android 3.0 - API 11(Honeycomb)


4
投票
@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();
}

有用


3
投票

Webview.loadUrl( “关于:空白”);

它也在工作


3
投票

在遇到这个问题后,似乎onPause可能没有做任何事情......对我而言,它并没有停止在后台播放的任何内容。

所以我的代码现在看起来像

@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();
}

希望它可以帮助任何与我有同样问题的人

© www.soinside.com 2019 - 2024. All rights reserved.