Android – вспышка вспышки камеры в неправильных интервалах на разных устройствах

Я разрабатываю приложение, в котором я хочу мигать вспышкой в ​​определенный интервал.

Ниже приведены шаги, которые я выполнил.

1) Установите таймер для определенного интервала.

2) В методе run() я сделал код для TurnOn и TurnOff flash.

Но интервал мигания вспышки различен на разных устройствах. Время таймера такое же для всех устройств, я также поставил Вход между ними, я получаю одинаковые значения, но, тем не менее, проблема там.

Это проблема с оборудованием, потому что аппаратное обеспечение отличается для разных устройств. Я также тестировал iPhone 5s (конвертируя тот же код в iOS), но вспышка мигает намного быстрее, чем Android.

Для Android я тестировал Nexus 4, Motorola G2, Sony Xperia Neo и работает нормально.

Проблема заключается в Nexus 5 и Samsung Galaxy S4.

РЕДАКТИРОВАТЬ

Код таймера:

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

У меня была такая же проблема с фонариком, и проблема не связана с таймером. Речь идет о том, как вы включаете и выключаете вспышку . На некоторых устройствах, таких как Nexus 5, вы должны иметь и использовать SurfaceView внутри своего макета. Было бы полезно показать нам методы, которые вы используете для включения и выключения фонарика.

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

Это старая проблема, но проблема по-прежнему сохраняется и сегодня, я опубликую, как я решил это.

Проблема в том, что вызов включения или выключения светодиода занимает много времени, чтобы пройти через операционную систему Android. Способ обработки этих вызовов зависит от телефона.

Прежде всего вам нужно измерить время, необходимое для включения и выключения светодиода, начиная с момента вызова. Используйте вход с камеры, держите телефон близко к поверхности и измерьте изменение яркости в кадре. Вы можете использовать glReadPixels, если работаете с OpenGL и зачитываете осевую линию только для каждого кадра. Вам нужно будет сделать несколько измерений, так как вызов может быть короче или длиннее в зависимости от состояния ОС. Желательно, чтобы вы не имели никакого буфера или фиксированного буфера кадров, поэтому время кадров является надежным (что может быть не в случае сжатия). Я использовал OpenGL и SurfaceTexture, и это быстрый способ.

Теперь вы знаете минимальное (1) и максимальное (2) время, необходимое для обращения к ОС. Используя эту информацию, вы можете заставить светодиод мигать как можно быстрее на телефоне. Чтобы получить максимальную отдачу от этого, начните второй вызов вспышки до того, как пройдет максимум (2); Максимум (2) – minium (1).

Используя последний трюк, скорость мигания в основном зависит от разницы в минимальном и максимальном времени обхода вызова. Это обычно очень сильно отличается от телефона, от 10 мс до 100 мс +.

Также обратите внимание, что, поскольку измерение времени прохождения вызова происходит с камерой, время округляется вверх / вниз до 33 мс сегментов (@ 30 кадров в секунду).

Возможно, вы можете попробовать использовать функции Alarm, такие как:

  1. https://developer.android.com/training/scheduling/alarms.html

  2. https://developer.android.com/reference/android/provider/AlarmClock.html

Вы можете установить период повторения сигнала тревоги. Сделайте 2 сигнала тревоги, один для On и один для Off. Даже телефон работает очень жестко, будильник будет работать в зависимости от времени. Поэтому, возможно, он не будет отключен и дважды включен по ошибке, но решение будет таким же.

А также вы используете 200 миллисекунд. Трудно усваивать устройство таким малым временным интервалом. Возможно, вы попытаетесь увеличить интервалы времени?