¿Cómo puedo pausar el contenido de Flash en un WebView de Android cuando mi actividad no es visible?

Estoy experimentando con el uso de un WebView para mostrar contenido Flash dentro de mi actividad. Todo está funcionando bastante bien, pero cuando el usuario toca la tecla de inicio para poner la actividad en segundo plano, el contenido de Flash sigue funcionando (el sonido sigue reproduciéndose, etc.)

He notado que tanto el navegador de Android de acciones como el de Dolphin Browser parecen evitar este problema y pausar apropiadamente el contenido de Flash cuando la actividad de navegación se pone en segundo plano.

Idealmente, me gustaría una solución que mata el WebView completamente si la actividad está terminando, pero lo detiene de otra manera (básicamente copiando el comportamiento predeterminado del navegador)

Aquí está una prueba simple que junté que carga un juego en Kongregate que tiene cierta música de fondo:

public class BrowserTest extends Activity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWebView = new WebView(this); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setPluginsEnabled(true); mWebView.loadUrl("http://m.kongregate.com/games/Jiggmin/the-game-of-disorientation-mobile"); setContentView(mWebView); } @Override protected void onPause(){ super.onPause(); mWebView.pauseTimers(); if(isFinishing()){ mWebView.loadUrl("about:blank"); setContentView(new FrameLayout(this)); } } @Override protected void onResume(){ super.onResume(); mWebView.resumeTimers(); } } 

He echado un vistazo a la última fuente para el navegador de valores, y parece estar haciendo algo similar (llamando a pauseTimers / resumeTimers), aunque me temo que el código que he estado buscando está fuera de fecha, porque está llamando a funciones que don Parece que ya no existe.

Hice verificar que la llamada a pauseTimers está trabajando probando con un simple JavaScript setInterval que actualiza un contador. ¿Hay algo más obvio que debería estar tratando con respecto a la ventana o ver la gestión?

La documentación para el reproductor Flash móvil dice:

Flash Player también pausará automáticamente la reproducción SWF, no está a la vista o la aplicación de primer plano, por ejemplo, cuando se recibe una llamada o se apaga la alarma, para reducir la utilización de la CPU, el uso de la batería y el uso de la memoria.

Esto parece estar funcionando perfectamente tanto en el navegador de valores como en el navegador de Dolphin, pero no en mi aplicación. Cualquier ideas / soluciones sería muy apreciada!

Actualización: Aquí está la función que terminamos añadiendo a nuestra actividad para que esto funcione. Lo llamamos con "onPause" en la función onPause de la actividad y "onResume" en la función onResume de la actividad:

 private void callHiddenWebViewMethod(String name){ if( mWebView != null ){ try { Method method = WebView.class.getMethod(name); method.invoke(mWebView); } catch (NoSuchMethodException e) { Log.error("No such method: " + name, e); } catch (IllegalAccessException e) { Log.error("Illegal Access: " + name, e); } catch (InvocationTargetException e) { Log.error("Invocation Target Exception: " + name, e); } } } 

2 Solutions collect form web for “¿Cómo puedo pausar el contenido de Flash en un WebView de Android cuando mi actividad no es visible?”

No veo donde ves que BrowserActivity o algo está llamando a pauseTimers() . Veo donde onPause() para BrowserActivity finalmente las rutas a onPause() de WebView . Sin embargo, onPause() de WebView tiene la anotación @hide y por lo tanto no forma parte del SDK. Fuera del manguito, parecería que onPause () es lo que quieres, dado el comentario:

Llame a esto para pausar cualquier procesamiento adicional asociado con esta vista y su DOM asociado / plugins / javascript / etc. Por ejemplo, si la vista se toma fuera de la pantalla, podría llamarse para reducir el tráfico innecesario de la CPU y / o de la red. Cuando la vista vuelva a estar "activa", llame aResume ().

Tenga en cuenta la referencia a "plugins", que no se menciona en la documentación pauseTimers() .

Intentaría usar la reflexión para ver si onPause() (y más tarde onResume() , cuando quieres que las cosas empiecen de nuevo) hace lo que necesitas. Si lo hace, por favor, publique un problema a b.android.com acerca de esto, pidiéndoles que agregue estos métodos (o equivalentes) al SDK. Su requisito parece que será uno común, y una solución que va más allá del SDK no es una buena solución.

 @Override protected void onPause() { super.onPause(); this.callHiddenWebViewMethod("onPause"); } @Override protected void onResume() { super.onResume(); this.callHiddenWebViewMethod("onResume"); } 

Así es como lo llamas en tu actividad … Funciona como un encanto.

  • Cargar archivo local y obtener Error cromo desconocido: -6
  • La vista Web de Android da el mensaje net :: ERR_CACHE_MISS
  • ¿Cómo puedo tomar una captura de pantalla de una vista web, capturar la página completa?
  • Android WebView Reproducción de vídeo HTML5 / h.264 / mp4, Cómo llegar a MediaPlayer
  • ¿Es -webkit-column-break-before compatible con Android 2.3 WebView?
  • Falta el nombre de archivo para openFileChooser Android 4.4.4
  • Reproducción de archivos de audio locales en la aplicación de visualización web de Android
  • Android WebView para Facebook como botón
  • OnLongClickListener no funciona en WebView
  • Pinch de la vista web de Android zoom local image
  • Mostrar círculo de actividades antes de cargar la vista web - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.