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

15 ответов:

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

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

единственный трюк с этим заключается в том, что вы не можете вызвать метод onPause WebView напрямую, потому что он скрыт. Поэтому вам нужно будет вызвать его косвенно через отражение. Следующий код должен помочь вам начать настройку 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 выше является частной переменной экземпляра для класса и назначается в методе onCreate действия.

Решение: 1 - Проведя много времени, я пришел к выводу пауза видео который играет с WebView <iframe> концепция 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");

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

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

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

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

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

Я заставляю webview загружать несуществующий html-файл. Это, кажется, заставляет webview очищать вещи.

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

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

он работает

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

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

Webview.loadUrl ("about: blank");

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

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

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

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

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

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

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

   }

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

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

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

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

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

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

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

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

этот код работает прекрасно для меня.

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