Android – Teclas de volumen como disparadores de la cámara | Autor: Raed Ghazal | Agosto de 2021
Lo tratamos como el comportamiento predeterminado en la mayoría de las aplicaciones, ¡pero no sabemos cómo implementarlo en nuestra aplicación!
Puede que haya un botón en nuestra aplicación para tomar fotos o videos, pero ¿alguna vez se preguntó cómo usar las teclas de volumen del teléfono para tomar fotos y videos sin tocar la pantalla del teléfono? Bueno, esto es lo que vamos a aprender hoy.
Primero, comencemos con «¿Por qué?»Segundo Mejor experiencia de usuario, porque a veces necesitas tomar fotos, pero tienes algo en la mano y no quieres tocar la pantalla, por eso siempre nos esforzamos por brindarles a nuestros usuarios la mejor experiencia, ¿verdad?
Para algunas personas, esto puede ser obvio, pero podemos compartir nuestra experiencia para que otros no tengan que pensar en ello y tratar de corregir todos los errores.
Entonces empecemos,
Este blog usa el lenguaje Kotlin, pero no te enseñaré cómo implementar una cámara y tomar fotos o videos aquí, solo te enseñaré cómo implementar la función de usar la tecla de volumen como disparador en tu aplicación.
Primero, En su clase de actividad, necesitamos anular este método dispatchKeyEvent
Entonces, para comprender el papel de esta función,
Se llamará siempre que el usuario realice un evento en cualquier tecla (como la tecla de volumen).
esta KeyEvent
Contiene los 2 atributos principales que vamos a utilizar, KeyEvent.keyCode
Representa la clave para realizar la acción, y KeyEvent.action
Representante, bueno, la acción realizada.
Ahora que super.dispatchKeyEvent(event)
¿método? Básicamente, llámelo para realizar la función predeterminada de la tecla programada, como la tecla de volumen para aumentar o disminuir el volumen.
Entonces, lo que queremos hacer es evitar esta operación predeterminada y realizar nuestra propia operación.
Ahora tenemos que comprobar keyCode
Coincidir con las teclas que queremos (teclas de volumen)
De esta forma, guardamos la función clave que queremos, si la clave no es nuestra clave, entonces ignorará el código y regresará super.dispatchKeyEvent(event)
Realiza su función predeterminada.
Ahora que tenemos la clave, ¿cuál es el siguiente paso?
Tenemos dos acciones que nos importan, KeyEvent.ACTION_DOWN
con KeyEvent.ACTION_UP
Comencemos con la grabación de video.
¡Vaya, esto es un gran cambio!
Bueno, no te preocupes 😄
Por lo tanto, grabar significa que presionaremos la tecla de volumen y la mantendremos presionada un rato (presión larga) para comenzar a grabar y continuar grabando hasta que la sueltemos.
Así que definimos un controlador para manejar nuestra llamada postDelayed.
Y un ejecutable que se ejecutará una vez que digamos que se ha ejecutado la pulsación larga.
De aquí en adelante ACTION_DOWN Lo llamamos .postDelayed
Y pase nuestro runnable para ser llamado después de mucho tiempo, veo que 300 milisegundos es lo correcto.
próximo ACTION_UP, Necesitamos verificar, si se realiza una pulsación larga (han pasado nuestros 300 milisegundos) y el video ha comenzado a grabar, debemos detener la grabación, ¡y ahora ha completado con éxito el video usando las teclas de volumen!
De lo contrario, si el video no comienza a grabar, significa que es una presión corta, entonces debemos eliminar la devolución de llamada y cancelar la grabación de video ejecutable.
Ahora todo está claro, lo que se necesita junto a las condiciones ACTION_DOWN Este es isCameraRecording
🤔?
Bien, tenemos 2 botones de volumen, ¿verdad? Ahora bien, si se está grabando un video, no necesitamos volver a llamar el video para comenzar a grabar, lo que no hará que tengamos problemas.
ahora Para completar la foto, um, esto es muy simple, simplemente llamamos takePicture()
existe ACTION_UP Si el video no está grabado, significa presionar brevemente. (Verifique el teléfono al lado // Solo nuevas líneas)
¡estupendo! ¡Estámos jodidos! !
Bueno, no se emocionen, hay una pequeña cosa que agregar 😛
¿Recuerdas lo que dije antes?Tenemos 2 botones de volumen y lo manejamos ACTION_DOWN, Ahora tenemos que lidiar con eso ACTION_UP.
Después de ejecutar ACTION_UP, debemos bloquear los botones durante un breve período de tiempo para evitar la superposición. Por ejemplo, mantenga presionados dos botones y luego suéltelos al mismo tiempo. Esto llamará a ACTION_UP dos veces, el primero detendrá el video «OK :)» el segundo Uno tomará fotos «No es bueno :(«.
Entonces, para deshabilitar la clave por un período de tiempo, necesitamos tener una variable isVolumeKeysDisabled
pronto ACTION_UP, Nosotros definimos isVolumeKeysDisabled
Es verdad y llama .postDelayed
Runnable los volvió a cambiar a falso después de un tiempo, y descubrí que 400 milisegundos es un buen momento.
Antes de hacer nada con la operación de la tecla de volumen, verificamos si isVolumeKeysDisabled
Si es cierto, lo ignoramos, si es falso, continuamos.
Espero poder explicar todo bien y presentar la mejor manera de lograr esta función.
Si hay algo que no está claro, o si cree que hay errores o errores en el código, no dude en hacer preguntas y estaré encantado de editarlas. ✌️
No olvides dejar algunos comentarios en los comentarios 😃
– – – – – – – – – – – – – – –
Mi GitHub: https://github.com/RaedGhazal
Mi cuenta de LinkedIn: https://www.linkedin.com/in/raed-o-ghazal/ (¡Dame una solicitud de conexión, gusto en conocerte!)