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

时间:2011-05-10 07:35:35

标签: android video webview youtube

如何停止在我的网页浏览中播放的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");

18 个答案:

答案 0 :(得分: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方法中赋值。

答案 1 :(得分:67)

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

只需在您使用onPause()时覆盖Activity或Fragment上的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");

答案 2 :(得分:17)

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

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

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

答案 3 :(得分:15)

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

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

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

答案 4 :(得分:5)

试试这个:

// HTML
this is a funky pointer -{ldelim}
// Code Gererated
this is a funky pointer -{
 
// HTML
This next is php {php} echo 'hello'; {/php}
// Code Gererated
This next is php <?php echo 'hello'; ?>
 
 
 
// HTML
I can count to 5: {for $i = 1; $i <= 5; $i++} {$i} {/for}
// Output Gererated
I can count to 5: 12345
 
// HTML
My numbers are {foreach from=$aVar item=iItem} {$iItem},
// Output Gererated
My numbers are 1,2,3,4,
 
 
 
// HTML
Show the ajax loading image {img theme='ajax/small.gif'}
 
// HTML Example Show an image uploaded by a user
{img server_id=$aPhoto.server_id path='photo.url_photo' file=$aPhoto.destination suffix='_150' max_width=150 max_height=150 class="hover_action" title=$aPhoto.title}

答案 5 :(得分: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();
}

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

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

答案 6 :(得分: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);
}

它有效

答案 7 :(得分: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();
}

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

答案 8 :(得分:3)

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

它也在工作

答案 9 :(得分:1)

This适合我。

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

答案 10 :(得分: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

答案 11 :(得分:0)

执行onPause()的方法onPause()时,可以使用WebView的方法Activity来执行此操作:

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

答案 12 :(得分:0)

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

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

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

答案 13 :(得分:0)

上述方法对我不起作用,对我有用的是:

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

答案 14 :(得分:0)

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

 String lastUrl = "";
 @Override
    public void onPause() {
        super.onPause();
        lastUrl =  webView.getUrl();
        webView.loadUrl("");
    }

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

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

答案 15 :(得分:0)

在我的情况下,播放器在WebView为“ onPause”后继续运行。 因此,在播放视频或音乐之前,我先检查WebView是否已连接到Windows。

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

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

答案 16 :(得分:0)

基于@sommesh的答案:

override fun onPause() {
    super.onPause()

    val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

    if (Utils.hasOreoSDK26()) {
        val audioAttributes = AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build()
        val audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
                .setAudioAttributes(audioAttributes)
                .setAcceptsDelayedFocusGain(true)
                .setWillPauseWhenDucked(true)
                .setOnAudioFocusChangeListener(
                        { focusChange -> Timber.i(">>> Focus change to : %d", focusChange) },
                        Handler())
                .build()
        audioManager.requestAudioFocus(audioFocusRequest)
    } else {
        audioManager.requestAudioFocus({ }, AudioManager.STREAM_MUSIC,
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
    }
}

答案 17 :(得分:-1)

这段代码非常适合我。

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