android - samsung - flash para llamadas y mensajes
Android: la luz del flash de la cámara parpadea a intervalos incorrectos en diferentes dispositivos (4)
Estoy desarrollando una aplicación, en la que quiero parpadear la luz del flash en un intervalo específico.
A continuación se encuentran los pasos que he seguido.
1) Configure el temporizador para un intervalo específico.
2) En el método run()
hice el código para TurnOn y TurnOff flash.
Pero el intervalo de parpadeo del flash es diferente en diferentes dispositivos. El tiempo del temporizador es el mismo para todos los dispositivos, también he puesto un Log-in entre, obtengo los mismos valores pero, aún así, el problema está ahí.
Es un problema de hardware, porque el hardware es diferente para diferentes dispositivos. También probé en el iPhone 5s
(al convertir el mismo código en iOS) pero el parpadeo del flash es mucho más rápido que Android.
Para Android, he probado en Nexus 4, Motorola G2, Sony Xperia Neo y está funcionando bien.
El problema es con Nexus 5 y Samsung Galaxy S4.
EDITAR
Código de temporizador:
long delayLong = 200;
long timerValueLong = 500;
Timer timer;
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!mLightOn) {
turnOnFlash();
} else {
turnOffFlash();
}
}
}, delayLong, timerValueLong);
Este es un problema anterior, pero el problema aún persiste hoy así que publicaré cómo resolví esto.
El problema es que la llamada para encender o apagar el LED requiere una cantidad variable de tiempo para atravesar el sistema operativo Android. La forma en que se manejan estas llamadas depende del teléfono.
En primer lugar, debe medir el tiempo que tarda el LED en encenderse y apagarse a partir del momento en que la llamada lo hace. Utilice la entrada de la cámara, mantenga el teléfono cerca de una superficie y mida el cambio de brillo en el cuadro. Puede usar glReadPixels si trabaja con OpenGL y leer la línea central solo en cada cuadro. Tendrá que hacer mediciones múltiples, ya que la llamada puede ser más corta o más larga dependiendo del estado del sistema operativo. Preferiblemente, no querría tener un búfer ni un búfer fijo de fotogramas, por lo que el momento de los fotogramas es confiable (lo que podría no ser el caso con la compresión). Usé OpenGL y SurfaceTexture y esta es una forma ágil.
Ahora sabe el tiempo mínimo (1) y máximo (2) que le lleva a la llamada atravesar el sistema operativo. Con esta información, puede hacer que el LED parpadee lo más rápido posible en el teléfono. Para aprovecharlo al máximo, inicie la segunda llamada al flash antes de que haya transcurrido el tiempo máximo (2); máximo (2) - minio (1).
Usando el último truco, la velocidad del parpadeo depende principalmente de la diferencia en el tiempo mínimo y máximo del recorrido de la llamada. Esto es típicamente muy diferente por teléfono, de 10ms a 100ms +.
También tenga en cuenta que debido a que la medición del tiempo de cruce de llamadas ocurre con la cámara, los tiempos se redondean hacia arriba o hacia abajo a segmentos de 33 ms (@ 30 fps).
Tal vez puedas intentar usar funciones de Alarma como:
https://developer.android.com/training/scheduling/alarms.html
https://developer.android.com/reference/android/provider/AlarmClock.html
Tu puedes configurar un período de repetición para la alarma. hacer 2 alarmas, una para encendido y otra para apagado. Incluso el teléfono tiene un funcionamiento difícil, la alarma funcionará dependiendo de la hora del reloj. así que tal vez no se apague y dos veces se encienda por error, pero la solución será la misma.
y también estás usando 200 milisegundos. es difícil capturar el dispositivo en un intervalo de tiempo tan pequeño. ¿Tal vez intentarás aumentar tus intervalos de tiempo?
Tuve el mismo problema con la linterna y el problema no está relacionado con el temporizador. Se trata de cómo está encendiendo y apagando el flash . En algunos dispositivos como Nexus 5, debe tener y usar SurfaceView dentro de su diseño. Sería útil mostrarnos los métodos que está utilizando para encender y apagar la linterna.
long delayLong = 20;
long timerValueLong = 100;
Timer timer;
final Parameters p = camera.getParameters();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!isLighOn) {
p.setFlashMode(Parameters.FLASH_MODE_ON);
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
isLighOn = true;
} else {
p.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
isLighOn = false;
}
}
}, delayLong, timerValueLong);