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!
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();
}
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
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 ().
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();
}
Dans la onDestroy()
de l'activité:
@Override
protected void onDestroy() {
super.onDestroy();
webView.destroy();
}
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)