Android WebView не останавливается после нажатия пользователем
Я воспроизвожу видео YouTube внутри WebView. Я могу воспроизвести его, но когда человек покидает экран, я не могу остановить воспроизведение звука.
Я пробовал разные вещи внутри 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");
}
}
Любые мысли о том, что может помешать воспроизведению звука и что может вызвать его?
Спасибо!
Ответы
Ответ 1
попробуйте это, надеюсь, что это поможет:
@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();
}
Ответ 2
Вы должны позвонить:
webView.loadUrl("about:blank");
Он уничтожит все аудио/видео, а также объекты Javasript и остановит все запущенные функции в веб-браузере
Ответ 3
Взято из fooobar.com/questions/262349/...:
Вы должны переходить к WebView onPause() и onResume() из ваших действий onPause() и onResume() соответственно.
Приостанавливает любую дополнительную обработку, связанную с этим WebView, и его связанные DOM, плагины, JavaScript и т.д. Например, если этот WebView принимается за кадром, это может быть вызвано для уменьшения ненужного процессора или сетевой трафик. Когда этот WebView снова "активен", вызовите функциюResume().
Ответ 4
Ничто не работало для меня в некоторых или во всех устройствах. Это точное решение, я думаю. Работал для меня хорошо.
Как остановить воспроизведение видео в YouTube на веб-просмотре Android?
альтернативно для API >= 11 вы можете использовать
_webview.onPause(); по активности/фрагменту onPause
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
_webview.onPause();
}
Ответ 5
В действии onDestroy()
выполните:
@Override
protected void onDestroy() {
super.onDestroy();
webView.destroy();
}
Ответ 6
Вы можете сделать это, используя метод onPause()
вашего Activity
:
@override
public void onPause() {
super.onPause();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webview.onPause();
}
}
добавление проверки для использования в API >= 11 (Honeycomb)