Как остановить воспроизведение видео с YouTube в Android WebView? - PullRequest
62 голосов
/ 10 мая 2011

Как я могу остановить видео на 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");

Ответы [ 17 ]

88 голосов
/ 03 июня 2011

См. Следующий пост о потоках WebView, которые никогда не останавливаются

По сути, вам нужно вызвать метод onPause WebView из метода onPause вашей собственной деятельности.

Единственная хитрость в том, что вы не можете вызвать метод onPause WebView напрямую, потому что он скрыт.Поэтому вам нужно будет вызвать это косвенно через отражение.Следующий код должен помочь вам начать настройку метода onPause вашего Activity:

@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) {
        ...
    }
}

Обратите внимание, что переменная 'webview' в блоке try выше является частной переменной экземпляра для класса и назначена вметод действия onCreate.

68 голосов
/ 19 августа 2014

Решение: 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");
17 голосов
/ 03 декабря 2014

Вы также должны реализовать метод onResume () или во второй раз он не будет работать

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

@Override
public void onPause()
{
    super.onPause();
    webView.onPause();
}
15 голосов
/ 09 мая 2013

Вышеприведенное решение мне не удалось на Samsung Galaxy S с Android 2.3.3.Но я добился успеха, попробовав следующий обходной путь:

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

Я заставляю веб-просмотр загружать несуществующий HTML-файл.Похоже, это заставляет веб-браузер убирать вещи.

6 голосов
/ 20 мая 2016

Попробуйте это:

@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();
}
5 голосов
/ 25 сентября 2015

А вот мой личный фаворит:

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

Он приостанавливает веб-просмотр, если просмотр только приостановлен, но очищает его по окончании действия.

Для этого требуется как минимум Android 3.0 - API 11 (Honeycomb)

4 голосов
/ 19 марта 2014
@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);
}

работает

3 голосов
/ 20 апреля 2015

После столкновения с этой проблемой кажется, что 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();
}

Надеюсь, это поможет любому с той же проблемой, что и я

3 голосов
/ 20 ноября 2014

Webview.loadUrl ("about: blank");

также работает

2 голосов
/ 12 августа 2016

вы можете попробовать это

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"); 

   }

Как ввести Подробнее см. здесь

...