Как остановить воспроизведение видео на YouTube в Android-браузере?

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

Ответ 1

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

По существу вам нужно вызвать метод WebView onPause из вашего собственного метода onPause Activity.

Единственный трюк в том, что вы не можете вызвать метод 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) {
        ...
    }
}

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

Ответ 2

Решение: 1 - Проведя много времени, я пришел к выводу приостановить видео, которое воспроизводится с концепцией HTML WebView <iframe>.

Просто переопределите метод 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");

Ответ 3

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

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

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

Ответ 4

Вышеупомянутое решение не получилось для меня на Samsung Galaxy S с Android 2.3.3. Но я сделал успешную попытку обходного пути ниже:

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

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

Ответ 5

Попробуйте следующее:

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

Ответ 6

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

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

Ответ 7

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

работает

Ответ 8

Webview.loadUrl( "О: пусто" );

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

Ответ 9

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

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

Ответ 10

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

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

   }

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

Ответ 11

Это работает для меня.

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

Ответ 12

Вы можете сделать это, используя метод onPause() WebView, когда выполняется метод onPause() вашего Activity:

@override
public void onPause() {
        super.onPause();
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
          webview.onPause();
        }
}
  • работает для API >= 11 (Honeycomb)

Ответ 13

Это то, что, наконец, работало после попытки каждого кода, представленного на этой странице. Уфф!

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

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

Ответ 14

Вышеупомянутый подход не работает для меня, тот, который работал для меня:

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

Ответ 15

Я попробовал все вышеперечисленные ответы, но большинство из них не работают для меня. так что я просто пишу свое собственное решение, которое отлично работает во всех типах медиа, играющих в 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;
    }

Ответ 16

В моей ситуации проигрыватель продолжает работать после того, как WebView "onPause". Поэтому я проверяю, прикреплен ли WebView к окнам перед воспроизведением видео или музыки.

Это метод JavaScriptInterface для проверки WebView "isAttachedToWindow()" возвращает true/false.

(И я не забыл вызвать onPause/onResume в Activity/Fragment.)

Ответ 17

Этот код отлично подходит для меня.

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