¿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.

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(); } } 

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(); 
  • Android: LED no se enciende / apaga
  • problema con la toma de fotografías con la cámara Android
  • Determinación de la resolución de la cámara (es decir, megapíxeles) Programatically in Android
  • Mantener la devolución de llamada de vista previa mientras graba vídeo?
  • Orientación de la cámara en el dispositivo Samsung
  • Cómo configurar framelayout para el paisaje, incluso si mi actividad está en modo retrato en android 2.3.1
  • Android Cámara de grabación de vídeo, pero juega al revés
  • Apertura de la cámara en modo vertical con Intent
  • La cámara se bloquea inesperadamente en el nexo de la galaxia
  • ¿Cómo obtener datos de vista previa sin procesar de un objeto de cámara al menos 15 cuadros por segundo en Android?
  • Cómo encender la linterna y la cámara frontal al mismo tiempo en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.