Comment arrêter la lecture de vidéos youtube dans Android webview?

Comment puis-je arrêter une vidéo YouTube qui est lue dans mon webview? Lorsque je clique sur le bouton Retour, la vidéo ne s'arrête pas et continue à la place en arrière-plan.

Code:

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");
61
demandé sur Sergey Litvinov 2011-05-10 11:35:34

15 réponses

Voir le post suivant à propos de WebView threads ne s'arrêtant jamais

Essentiellement, vous devrez appeler la méthode onPause de WebView à partir de la méthode onPause de votre propre activité.

La seule astuce avec ceci est que vous ne pouvez pas appeler directement la méthode onPause de WebView car elle est cachée. Par conséquent, vous devrez l'appeler indirectement via la réflexion. Le code suivant devrait vous aider à configurer la méthode onPause de votre propre activité:

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

Notez que le la variable 'webview' dans le bloc try ci-dessus est une variable d'instance privée pour la classe et est affectée à la méthode onCreate de l'activité.

87
répondu Andrew Thompson 2017-05-23 12:17:54

Solution: 1 - Après avoir passé beaucoup de temps, j'ai eu la conclusion de mettre en pause la vidéo qui joue avec WebView <iframe> concept de HTML.

Remplacez simplement la méthode onPause() sur L'activité ou le Fragment où que vous ayez utilisé WebView, et appelez-la. Il fonctionne pour moi.

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

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

Solution: 2 - Si la solution ci-dessus ne fonctionne pas pour vous, vous pouvez forcer WebView à charger un fichier html inexistant.

mWebview.loadUrl("file:///android_asset/nonexistent.html");
62
répondu vishesh chandra 2016-09-13 05:15:45

Vous devez également implémenter la méthode onResume() ou la deuxième fois que cela ne fonctionnera pas

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

@Override
public void onPause()
{
    super.onPause();
    webView.onPause();
}
17
répondu CLucera 2018-04-11 18:54:01

La solution ci-dessus a échoué pour moi sur Samsung Galaxy S avec Android 2.3.3. Mais j'ai réussi à essayer la solution de contournement ci-dessous:

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

Je force webview à charger un fichier html inexistant. Cela semble forcer le webview à nettoyer les choses.

14
répondu dangel 2013-05-09 10:01:56

Essayez ceci:

@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
répondu Joolah 2016-05-20 04:05:47
@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);
}

Ça marche

4
répondu user3437083 2014-03-19 10:20:50

Et voici mon préféré:

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

Il met en pause le webview si la vue est seulement en pause, mais l'efface lorsque l'activité est terminée.

Cela nécessite au moins Android 3.0-API 11 (Honeycomb)

4
répondu Björn Kechel 2015-09-25 16:24:15

Webview.loadUrl ("about:blank");

Il fonctionne également

3
répondu Sanghwa Jung 2014-11-20 07:44:58

Après avoir rencontré ce problème, il semble que onPause pourrait ne rien faire... pour moi, ce n'était pas arrêter tout ce qui jouait en arrière-plan.

Donc, mon code ressemble maintenant à

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

J'espère que cela aidera toute personne ayant le même problème que moi

3
répondu Krzysztof Dubrowski 2015-04-20 12:31:18

Ce fonctionne pour moi.

@Override
protected void onPause() {
    super.onPause();
    if (wViewCampaign != null){
        wViewCampaign.stopLoading(); 
        wViewCampaign.loadUrl("");
        wViewCampaign.reload();
        wViewCampaign = null;
    }
}
1
répondu Manuel Schmitzberger 2017-05-23 10:31:30

Vous pouvez essayer ceci

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

Si la page en cours de chargement est celle que vous pouvez éditer, vous pouvez écrire une méthode javascript qui arrête l'audio et appelle quand vous voulez arrêter comme.

Fonction Javascript

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

De Andorid Appeler cette méthode

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

Si la page n'est pas modifiable par vous que vous pouvez injecter le code js

   @Override
   public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);

      injectScriptFile(view, "js/script.js"); 

   }

Comment Injecter Voir Ici en Détail

1
répondu Azmat Karim Khan 2017-05-23 10:31:30

, Vous pouvez le faire en utilisant la méthode onPause() de la de la WebView est exécutée lorsque la méthode onPause()votre Activity :

@override
public void onPause() {
        super.onPause();
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
          webview.onPause();
        }
}
  • fonctionne pour API >= 11 (Honeycomb)
0
répondu Jorgesys 2015-06-23 22:43:37

C'est ce qui a finalement fonctionné après avoir essayé chaque code fourni sur cette page. Uff!

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

@Override
protected void onResume() {
    super.onResume();
}
0
répondu Ramesh Seervi 2015-11-19 11:55:08

L'approche ci-dessus ne fonctionne pas pour moi, celle qui a fonctionné pour moi est :

@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);
}
0
répondu sommesh 2018-05-22 05:18:34

Ce code fonctionne parfaitement pour moi.

 @Override protected void onPause() {
    super.onPause();
    wv.onPause();
    wv.pauseTimers();
}
    @Override protected void onResume() {
    super.onResume();
    wv.resumeTimers();
    wv.onResume();
}
-1
répondu Roberto López 2016-01-05 08:20:35