Detectar cuando los botones del sistema son visibles mientras se usa 'modo inmersivo'

Actualmente utilizo el modo de inmersión (API 19) para una de mis actividades como sigue:

getWindow().getDecorView() .setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.INVISIBLE); 

Esto oculta los botones del sistema y la barra de notificación hasta que el usuario vuelva a apagarlos. Esto funciona bien, sin embargo deseo detectar cuando el usuario vuelve a hacer los botones visibles. He intentado un OnSystemUiVisibilityChangeListener pero no se OnSystemUiVisibilityChangeListener para este evento en particular.

¿Algunas ideas?

Desde el vídeo de desarrolladores de Android, cuando estás en un modo de inmersión, la aplicación no se notifica.

El modo pegajoso inmersivo empieza a las 6:56 y alrededor de las 7:25 Roman Nurik dice que el oyente no se disparará.

Este es el video: http://youtu.be/cBi8fjv90E4?t=6m56s

RESPUESTA ACTUALIZADA:

Establezca OnSystemUiVisibilityChangeListener, forzar el modo inmersivo cuando la visibilidad es 0 (en lugar de 6).

 if(android.os.Build.VERSION.SDK_INT >= 19) { getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if(visibility == 0) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } } }); } 

ANTIGUO, DESAGRADABLE RESPUESTA:

Esto es desagradable, pero es una solución IFF que estaba mostrando un ActionBar:

  • Agregue un OnGlobalLayoutListener al ViewTreeObserver de 'action_bar_container'.
  • En la implementación de OnGlobalLayoutListener, compruebe si la visibilidad 'action_bar_container' es GONE o no.
  • Cuando se trasladó de GONE a! GONE (y suponiendo que estuviera en modo inmersivo), entonces la fuerza de inmersión modo de nuevo a través del método setSystemUiVisibility.

 if(android.os.Build.VERSION.SDK_INT >= 19) { int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android"); ((ViewGroup)findViewById(actionBarContainerId)).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android"); ViewGroup actionBarContainer = (ViewGroup) findViewById(actionBarContainerId); if(actionBarContainer.getVisibility() == View.GONE) { if(DEBUG) Log.d(TAG, "...PROBABLY IN IMMERSIVE MODE AND ALL IS GOOD!.."); } else { if(DEBUG) Log.d(TAG, "...PROBABLY NO LONGER IN IMMERSIVE MODE, HEY.."); getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } } }); } 

He encontrado una solución que me conviene aunque no sea perfecta. Establecer la visibilidad de la interfaz de usuario a View.SYSTEM_UI_FLAG_IMMERSIVE lugar de View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY y cuando recibo la onSystemUiVisibilityChange llamada onSystemUiVisibilityChange , retraso un mensaje a un controlador para restablecer la visibilidad de la interfaz de usuario. Aquí está el código:

 private static final int FULL_SREEN_MSG = 10; private static final long TIME_BEFORE_HIDE_UI = 2 * DateUtils.SECOND_IN_MILLIS; private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == FULL_SREEN_MSG) { setFullscreen(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setFullscreen(); getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this); } private void setFullscreen() { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE); } @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { mHandler.sendEmptyMessageDelayed(FULL_SREEN_MSG, TIME_BEFORE_HIDE_UI); } } 

En 4.4, la aplicación no recibirá ninguna indicación cuando las barras del sistema transitorio se revelan o se ocultan automáticamente (bajo IMMERSIVE_STICKY), ya sea a través de OnSystemUiVisibilityChangeListener u otros medios.

Usted puede escuchar swipes de borde similar al oyente gesture system como una suposición, pero esto no es parte de la api pública, puede cambiar en versiones futuras y difieren entre dispositivos.

Tengo curiosidad por lo que quieres hacer cuando se muestren / oculten las barras del sistema transitorio.

  • Establecer la configuración del bloqueo de pantalla interactivamente
  • En Android KitKat, ¿es posible que una vista de superposición llene toda la pantalla?
  • Ejecutar KitKat Virtual Device en la CPU Intel
  • SSL cambios en android kitkat mantener la conexión de trabajo?
  • ¿Cómo se puede utilizar ViewPropertyAnimator para establecer Width a un valor específico
  • En la API de Android 19 (4.4), el método intent.createChooser causa IntentServiceLeak
  • Android - ListView extensible SetIndicatorBounds no funcionan en Kitkat android-4.4
  • Android mata a mi lanzador en BT connect
  • ¿Cómo salir completamente de Immersive pantalla completa?
  • No más Text Reflow después de ampliar KitKat WebView
  • Zoom de la cámara Google Glass XE16
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.