web-dev-qa-db-fra.com

Android WebView ne s'arrête pas après que l'utilisateur a appuyé sur

Je lis une vidéo YouTube dans une WebView. Je peux le lire, mais lorsque la personne quitte l'écran, je ne peux pas arrêter la lecture audio.

J'ai essayé différentes choses dans onDestroy et onPause, ou les retirer complètement, mais cela ne semblait pas faire de différence.

Quelqu'un pourrait-il savoir pourquoi l'audio continue de jouer et ne s'arrête pas même après que l'application est désactivée et que l'utilisateur ouvre d'autres applications?

Voici mon code pour toute la classe:

import com.flurry.Android.FlurryAgent;

import utils.SendEmail;
import Android.app.Activity;
import Android.app.AlertDialog;
import Android.content.Context;
import Android.content.DialogInterface;
import Android.content.Intent;
import Android.content.SharedPreferences;
import Android.os.Bundle;
import Android.preference.PreferenceManager;
import Android.view.KeyEvent;
import Android.view.View;
import Android.webkit.WebChromeClient;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;
import Android.webkit.WebSettings.PluginState;
import Android.widget.Button;

public class YoutubeActivity extends Activity
{
    WebView webview = null;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        webview = new WebView(this);

            setContentView(webview);

            webview.getSettings().setAppCacheEnabled(false);
            webview.getSettings().setJavaScriptEnabled(true);
            webview.setInitialScale(1);
            webview.getSettings().setPluginState(PluginState.ON);

            WebSettings webSettings = webview.getSettings();

            webSettings.setLoadsImagesAutomatically(true);
            webSettings.setLoadWithOverviewMode(true);
            webSettings.setBuiltInZoomControls(true);        
            webSettings.setUseWideViewPort(true);

            webview.setWebViewClient(new WebViewClient() {
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);              
                    return false;
                }
            });        


            webview.setWebChromeClient(new WebChromeClient(){});

            webSettings.setDomStorageEnabled(true);
            webSettings.setAppCacheEnabled(true);
                        webSettings.setAppCachePath(getApplicationContext().getFilesDir().getAbsolutePath() + "/cache");            

            webSettings.setDatabaseEnabled(true);
            webSettings.setDatabasePath(getApplicationContext().getFilesDir().getAbsolutePath() + "/databases");

            SharedPreferences prefs = 
                    PreferenceManager.getDefaultSharedPreferences( YoutubeActivity.this);
            String url_to_watch = prefs.getString( "url_to_watch" , null ); 


            webview.loadUrl(url_to_watch);
    }



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

       try
       {
           if ( webview != null )
           {
               webview.clearCache(true); 
               webview.getSettings().setAppCacheEnabled(false);
               webview.stopLoading();
               webview.destroy();           
               sendEmail ("in pause " , "");
               webview = new WebView(this);
           }

           this.finish();
       }
       catch ( Exception e )
       {

       }
    }


    @Override
    public void onDestroy()
    {
       super.onDestroy();

       try
       {
           if ( webview != null )
           {
               webview = new WebView(this); // To try to reset the webview - didn't work.
           }
       }
       catch ( Exception e )
       {

       }    
    }

    @Override
    public void onStop()
    {
       super.onStop();

       FlurryAgent.onEndSession(this);

       try
       {
           if ( webview != null )
           {
               webview.clearView();
               webview.getSettings().setAppCacheEnabled(false);
               webview.stopLoading();
               webview.destroy();

               sendEmail ("in stop " , "");
           }
       }
       catch ( Exception e )
       {

       }

       this.finish();
    }   

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

        try
        {
            webview.onResume();
        }
        catch ( Exception  e )
        {

        }
    }

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


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) 
        {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }   

    // Subject , body
    public void sendEmail( String subject , String body )
    {
        String[] params = new String[] { "http://www.problemio.com/problems/send_email_mobile.php", subject, body };

        SendEmail task = new SendEmail();
        task.execute(params);               
    }  


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

    public void onBackPressed ( )
    {   
        final AlertDialog.Builder linkedin_builder = new AlertDialog.Builder(this);

             linkedin_builder.setMessage("" +
                    "Go back to the home screen?")
                .setCancelable(false)            
                .setNegativeButton("YES", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) 
                    {
                        if ( webview != null )
                        {
                            webview.destroy();
                        }

                        Intent myIntent = new Intent(YoutubeActivity.this, MainActivity.class);
                        YoutubeActivity.this.startActivity(myIntent);
                    }
                })              
                .setPositiveButton("NO", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) 
                    {
                        dialog.cancel();                  
                    }
                })
;
         AlertDialog alert = linkedin_builder.create();
         alert.show();      
    }


    @Override
    protected void onStart()
    {
        super.onStart();
        FlurryAgent.onStartSession(this, "4VYNFK3V6RCZ53CZ3J32");
    }    
}

Avez-vous des réflexions sur ce qui pourrait empêcher la lecture audio et ce qui pourrait en être la cause? Je vous remercie!

29
Genadinik

essayez ceci, j'espère que cela vous aidera:

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

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


@Override
protected void onDestroy() {
    myWebView.destroy();
    myWebView = null;
    super.onDestroy();
}
49
Joolah

Vous devez appeler:

webView.loadUrl("about:blank");

Il détruira tous les objets audio/vidéo ainsi que Javascript et arrêtera toutes les fonctions en cours d'exécution sur la vue Web

29
ndquangr

Tiré de https://stackoverflow.com/a/17690221/3032209 :

Vous devez appeler via onPause () et onResume () de WebView à partir de onPause () et onResume () de votre activité, respectivement.

Interrompt tout traitement supplémentaire associé à cette WebView et à ses DOM, plug-ins, JavaScript, etc. associés. Par exemple, si cette WebView est supprimée de l'écran, cela pourrait être appelé pour réduire le trafic CPU ou réseau inutile. Lorsque cette WebView est à nouveau "active", appelez onResume ().

11
Yair Kukielka

Rien n'a fonctionné pour moi dans certains ou tous les appareils. C'est la solution exacte, je suppose. A bien fonctionné pour moi.

Comment arrêter la lecture d'une vidéo YouTube dans Android webview?

sinon pour API> = 11, vous pouvez utiliser _webview.onPause (); sur la pause de l'activité/du fragment

public void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        _webview.onPause();
}
10
Kamal Kishore

Dans la onDestroy() de l'activité:

@Override
protected void onDestroy() {
    super.onDestroy();
    webView.destroy();
}
5
ps95

Vous pouvez le faire en utilisant la méthode onPause() de votre Activity:

@override
public void onPause() {
    super.onPause();
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        webview.onPause();
    }
}

ajout d'une validation pour une utilisation dans l'API> = 11 (Honeycomb)

3
Jorgesys