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");
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.
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");
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();
}
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.
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();
}
@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 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)
Webview.loadUrl ("about: blank");
ça marche aussi
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
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");
}
Ceci travaille pour moi.
@Override
protected void onPause() {
super.onPause();
if (wViewCampaign != null){
wViewCampaign.stopLoading();
wViewCampaign.loadUrl("");
wViewCampaign.reload();
wViewCampaign = null;
}
}
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();
}
}
API >= 11
(Honeycomb
)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);
}
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;
}
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();
}
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.)