¿Cómo hacer que la luz de la cámara parpadee en una secuencia específica?
Estoy desarrollando una sencilla aplicación de código Morse que convierte el inglés a Morse y viceversa. Cuando el usuario entra en una letra específica la luz de la cámara en el dispositivo se supone que parpadea esa secuencia de Morse para la letra, por ejemplo:
A = trazo de punto con el punto siendo 200ms y el guión 500ms.
- Deje de guardar la imagen cuando abra la cámara usando Intentar desde mi aplicación
- Dónde colocar el autofoco en la cámara de la clase android
- Camera.takePicture () no funciona en mi JB & GB & Froyo teléfonos
- Cómo asignar coordenadas de marco a superposición en la visión
- Establecer parámetros de diseño dinámicamente
El problema es que no estoy seguro exactamente cómo lograr esto. He estado intentando resolver esto usando un bucle for pero no puedo resolverlo. A continuación se muestra el código que estoy tratando de ajustar – no estoy seguro de si el uso de un bucle para los mejores métodos, pero no puedo pensar en otra manera. ¿Alguien tiene alguna sugerencia / ideas, si es así que sería muy apreciado.
public void flashTranslation() { char[] cArray = message.toCharArray(); for (int i = 0; i < cArray.length; i++) { if (cArray[i] == '.') { turnOn(); new Handler().postDelayed(new Runnable() { @Override public void run() { turnOff(); camera.release(); } }, dot); } else { turnOn(); new Handler().postDelayed(new Runnable() { @Override public void run() { turnOff(); camera.release(); } }, dash); } } } public void turnOn() { if (camera != null) { Camera.Parameters p = camera.getParameters(); p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); camera.setParameters(p); camera.startPreview(); } } public void turnOff() { if (camera != null) { Camera.Parameters p = camera.getParameters(); p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); camera.setParameters(p); camera.stopPreview(); } }
- Android ha desaprobado android.hardware.Camera y ahora recomendamos usar android.hardware.camera2 pero esto no está disponible en nada debajo de la API 21
- OpenCV Android: Obtener fotogramas de la cámara en segundo plano sin mostrar en la pantalla
- Android Camera setDisplayOrientation no funciona
- Vista previa de la cámara Android extraña
- Evitar el vuelco de la cámara frontal
- Creación de mi propia aplicación de cámara + Captura automática de la imagen
- Obtener la extensión de archivo de imágenes seleccionadas de galería o cámara, como cadena
- La cámara no reemplaza la imagen antigua si cambia la orientación
La razón por la que este código puede estar dando problemas se debe al hecho de que no hay tiempo entre la luz apagando y encendiendo de nuevo.
En un instante, la luz se enciende. Luego, el runnable espera 200ms antes de apagarlo. Después de apagarlo, lo volverá a encender de inmediato, lo que significa que aunque el punto entre encenderlo a apagado fue de 200 ms, el tiempo entre encenderlo de nuevo a 0ms. Esto podría estar causando que la luz aparezca simplemente estar constantemente encendida sin ninguna de las pausas previstas.
Si no me equivoco, la creación de un nuevo controlador postDelayed simplemente ejecuta un runnable en un nuevo subproceso, que no es realmente lo que querría debido al hecho de que desea que el morse se lea en una cola.
Intente algo como esto:
public void flashTranslation() { int offIntervalTime = 50; char[] cArray = message.toCharArray(); for (int i = 0; i < cArray.length; i++) { if (cArray[i] == '.') { turnOn(); Thread.sleep(dot); turnOff(); Thread.sleep(offIntervalTime); } else { turnOn(); Thread.sleep(dash); turnOff(); Thread.sleep(offIntervalTime); } } }
Es probable que también tenga que implementar la gestión de excepciones para las interrupciones de subprocesos, pero esta es la estructura básica de lo que puede utilizar. Observe que hay una variable offIntervalTime. Esto se utiliza para definir el intervalo constante en el que la luz debe estar apagada, lo que permite que realmente parpadee.
Cuando llama a la función, asegúrese de que no está en el hilo primario, así que haga algo como esto donde lo llame:
Thread morseMessageThread = new Thread(new Runnable() { flashTranslation() }); morseMessageThread.start();