我在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");
}
}
有关可能阻止播放音频的内容以及可能导致音频播放的问题的任何想法? 谢谢!
答案 0 :(得分:49)
试试这个,希望它有所帮助:
@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();
}
答案 1 :(得分:28)
你应该致电:
webView.loadUrl("about:blank");
它将销毁所有音频/视频以及Javasript对象并停止webview上所有正在运行的功能
答案 2 :(得分:11)
取自https://stackoverflow.com/a/17690221/3032209:
您应该分别从Activity的onPause()和onResume()调用WebView的onPause()和onResume()。
暂停与此WebView及其相关的任何额外处理 关联的DOM,插件,JavaScript等。例如,如果这个WebView 从屏幕上取下,可以调用它来减少不必要的CPU或 网络流量。当此WebView再次“活动”时,请调用onResume()。
答案 3 :(得分:10)
在某些或所有设备中,我没有任何作品。这是我猜的确切解决方案。为我工作很好。
How to stop youtube video playing in Android webview?
或者,对于API> = 11,您可以使用 _webview.onPause();在活动的/片段的onPause
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
_webview.onPause();
}
答案 4 :(得分:5)
在活动的onDestroy()
中执行:
@Override
protected void onDestroy() {
super.onDestroy();
webView.destroy();
}
答案 5 :(得分:3)
您可以使用onPause()
:
Activity
来执行此操作
@override
public void onPause() {
super.onPause();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webview.onPause();
}
}
添加验证以在API> = 11(Honeycomb)中使用