web-dev-qa-db-fra.com

Comment arrêter la lecture d'une vidéo youtube dans une vue Web Android?

Comment puis-je arrêter une vidéo YouTube qui est lue dans ma visualisation Web? Lorsque je clique sur le bouton Précédent, la vidéo ne s’arrête pas et continue à l’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
Droid

Voir le post suivant sur Les threads WebView ne s'arrêtent jamais

Pour l'essentiel, vous devez appeler la méthode onPause de WebView à partir de la méthode onPause de votre propre activité. 

La seule astuce, c'est que vous ne pouvez pas appeler directement la méthode onPause de WebView car elle est masquée. Par conséquent, vous devrez l'appeler indirectement par réflexion. Le code suivant devrait vous aider à configurer votre propre méthode onPause de 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) {
        ...
    }
}

Notez que 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 Activity.

88
Andrew Thompson

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

Remplacez simplement la méthode onPause() sur Activité ou Fragment où que vous ayez utilisé WebView et appelez-la. Ça marche 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 vous convient pas, vous pouvez forcer WebView à charger un fichier html non existant.

mWebview.loadUrl("file:///Android_asset/nonexistent.html");
64
vishesh chandra

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

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

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

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 ci-dessous:

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

Je force la webview à charger un fichier HTML non existant. Cela semble forcer la vue Web à nettoyer les choses.

15
dangel

Essaye ça:

@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
Joolah
@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
user3437083

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 la vue Web si celle-ci est seulement suspendue, mais l'efface à la fin de l'activité.

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

4
Björn Kechel

Webview.loadUrl ("about: blank");

ça marche aussi

3
Sanghwa Jung

Après avoir rencontré ce problème, il semblerait qu’onPause ne fasse peut-être rien ... pour moi, cela n’arrêtait pas de jouer 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 ça aide quelqu'un avec le même problème que moi

3

tu peux essayer ça

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

si la page qui est en train de se charger est éditable, vous pouvez écrire une méthode javascript qui stoppe l'audio et appeler quand vous voulez arrêter,.

Fonction Javascript

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

De Andorid Appelez cette méthode

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

si vous ne pouvez pas modifier la page, 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
Azmat Karim Khan

Ceci travaille pour moi.

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

Vous pouvez le faire en utilisant la méthode onPause() de WebView quand est exécutée la méthode onPause()de 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
Elenasys

L'approche ci-dessus n'a pas fonctionné pour moi, celle qui a fonctionné pour moi est la suivante:

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

J'ai essayé toutes les réponses ci-dessus, mais la plupart ne fonctionnent pas pour moi. donc je viens d'écrire ma propre solution qui fonctionne très bien dans tout type de média en jouant dans 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;
    }
0
Abhiode

C'est ce qui a finalement fonctionné après avoir essayé chacun des codes fournis sur cette page. Uff!

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

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

Dans ma situation, le lecteur continue de s'exécuter après que WebView soit "onPause". Je vérifie donc si la WebView est attachée aux fenêtres avant de lire de la vidéo ou de la musique.

Il s'agit d'une méthode JavaScriptInterface permettant de vérifier "isAttachedToWindow ()" de WebView et renvoie true/false.

(Et je n'ai pas oublié d'appeler onPause/onResume in Activity/Fragment.)

0
hsu.tw