web-dev-qa-db-ja.com

Androidユーザーが押し返した後にWebViewが停止しない

WebView内でYouTubeビデオを再生しています。私はそれを再生することはできますが、その人が画面を離れたとき、オーディオの再生を停止することはできません。

OnDestroyとonPauseでさまざまなことを試したり、それらを完全に取り出したりしましたが、違いは見られませんでした。

アプリの電源をオフにしてユーザーが他のアプリを開いた後でも、オーディオが再生され続け、停止しない理由を誰もが知っていますか?

これがクラス全体の私のコードです:

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");
    }    
}

オーディオの再生が停止する可能性のある原因、および原因となる原因についての考えはありますか?ありがとうございました!

29
Genadinik

これを試して、それが役立つことを願って:

@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

呼び出す必要があります:

webView.loadUrl("about:blank");

Javasriptオブジェクトだけでなくすべてのオーディオ/ビデオを破壊し、webviewで実行中のすべての機能を停止します

29
ndquangr

https://stackoverflow.com/a/17690221/3032209 から取得:

アクティビティのonPause()およびonResume()からそれぞれWebViewのonPause()およびonResume()を呼び出す必要があります。

このWebViewおよび関連するDOM、プラグイン、JavaScriptなどに関連する追加の処理を一時停止します。たとえば、このWebViewが画面外に表示される場合、これを呼び出して不必要なCPUまたはネットワークトラフィックを削減できます。このWebViewが再び「アクティブ」になったら、onResume()を呼び出します。

11
Yair Kukielka

一部またはすべてのデバイスで何も機能しませんでした。これは私が推測する正確な解決策です。私のために働いた。

Android webview? でのYouTube動画の再生を停止する方法

あるいは、API> = 11の場合、_webview.onPause();を使用できます。アクティビティの/フラグメントのonPause

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

アクティビティのonDestroy() do:

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

ActivityのメソッドonPause()を使用して実行できます。

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

aPI> = 11(Honeycomb)で使用するための検証の追加

3
Jorgesys