Saltar al contenido

Android O – FLAG_SHOW_WHEN_LOCKED está obsoleto

Contamos con el hallazgo a esta obstáculo, al menos eso creemos. Si presentas preguntas coméntalo y sin dudarlo te responderemos

Solución:

KeyguardManager enciende la pantalla si attr turnScreenOn es true, por lo que es necesario el orden de los métodos y la llamada requestDismissKeyguard. Uso este código para la actividad, espero que ayude:

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) 
        setShowWhenLocked(true)
        setTurnScreenOn(true)
        val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
        keyguardManager.requestDismissKeyguard(this, null)
     else 
        this.window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
    

Bien, logré resolverlo con alguna solución alternativa y la ayuda de la respuesta de @Umair.

Como dije, estoy mostrando una vista que se creó en un servicio en segundo plano usando WindowManager y con el código que agregué a mi pregunta anterior, la vista se muestra sobre todas las demás aplicaciones pero no enciende la pantalla cuando la versión de Android es Android 8.

Los métodos que ahora reemplazan las banderas: FLAG_SHOW_WHEN_LOCKEDFLAG_TURN_SCREEN_ON son visibles para las actividades y no para los servicios o para WindowManager, y convertir el contexto en Actividad no es una buena idea y no lo ayudará 🙂

Entonces, lo que hice por ahora (solución temporal) es crear una actividad transparente y cuando llamo a showView() método de mi servicio en segundo plano, también estoy iniciando la actividad transparente.

En la actividad, dentro del método onCreate, estoy llamando a los métodos:

setShowWhenLocked(true) 
setTurnScreenOn(true)

y cuando se destruye la vista, la actividad también se destruirá con la ayuda del receptor de transmisión :), por lo que la pantalla ahora está encendida y la vista está por encima de todas las demás aplicaciones.

Sé que puede decirme que puedo mover mi código que está dentro de mi servicio a la nueva actividad.

La razón por la que lo hice de esa manera:

Estoy usando el reconocimiento de voz… y cuando lo codifiqué en la actividad, las cosas no funcionaron. Me refiero a que cuando la pantalla está bloqueada con un patrón, la actividad entra en estado de pausa y no puedo obtener los resultados. por lo que el patrón descartó mi actividad..

Así que decidí crear una vista usando el administrador de ventanas y funcionó bien hasta ahora, cuando Google (el equipo de Android) decidió desaprobar estas banderas. Así que esta es mi solución por ahora… y espero que alguien encuentre una mejor solución para este problema.

Entonces, de acuerdo con la documentación de Android, estos métodos quedaron en desuso, por lo que debe usar showWhenLocked or setShowWhenLocked(boolean) en lugar de.

FLAG_TURN_SCREEN_ON

int FLAG_TURN_SCREEN_ON
Esta constante quedó obsoleta en el nivel de API 27. Use turnScreenOn o setTurnScreenOn(boolean) en su lugar para evitar un evento de ciclo de vida doble no intencional.

Indicador de ventana: cuando se configura como una ventana que se agrega o se hace visible, una vez que se muestra la ventana, el sistema activará la actividad del usuario del administrador de energía (como si el usuario hubiera despertado el dispositivo) para encender la pantalla.

Y FLAG_SHOW_WHEN_LOCKED

int FLAG_SHOW_WHEN_LOCKED
Esta constante quedó obsoleta en el nivel de API 27. Use showWhenLocked o setShowWhenLocked(boolean) en su lugar para evitar un evento de doble ciclo de vida no intencional.

Indicador de ventana: indicador especial para permitir que se muestren las ventanas cuando la pantalla está bloqueada. Esto permitirá que las ventanas de la aplicación tengan prioridad sobre key
guard o cualquier otra pantalla de bloqueo. Se puede usar con FLAG_KEEP_SCREEN_ON para encender la pantalla y mostrar las ventanas directamente antes de mostrar el key
ventana de guardia. Se puede usar con FLAG_DISMISS_KEYGUARD para descartar automáticamente por completo los bloqueos de teclas no seguros. Esta bandera solo se aplica a la ventana de pantalla completa superior.

Entonces, de acuerdo con la documentación, la razón para desaprobar estos métodos fue evitar an unintentional double life-cycle event. Puedes leer más sobre ellos aquí. https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

Recuerda algo, que tienes permiso de reseñar si chocaste tu aprieto justo a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *