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");
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é.
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");
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();
}
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.
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();
}
@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
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)
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
Ce fonctionne pour moi.
@Override
protected void onPause() {
super.onPause();
if (wViewCampaign != null){
wViewCampaign.stopLoading();
wViewCampaign.loadUrl("");
wViewCampaign.reload();
wViewCampaign = null;
}
}
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");
}
, 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
)
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();
}
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);
}
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();
}