Android-вспышка камеры мигает в неправильных интервалах на разных устройствах
Я разрабатываю приложение, в котором я хочу мигать вспышкой в определенном интервале.
Ниже приведены шаги, которые я следовал.
1) Установите таймер для определенного интервала.
2) в run()
метод я сделал код для TurnOn и TurnOff flash.
но интервал вспышки отличается на разных устройствах. Время таймера одинаково для всех устройств, я также поставил журнал между ними, я получаю те же значения, но все же проблема есть.
это аппаратная проблема, потому что оборудование отличается для разных устройств. Я также протестировал в iPhone 5s
(путем преобразования одного кода в iOS), но вспышка мигает намного быстрее, чем Android.
для Android я протестировал Nexus 4, Motorola G2, Sony Xperia Neo, и он работает нормально.
проблема с Nexus 5 и Samsung Galaxy С4.
редактировать
код в Таймер :
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);
4 ответов
Это более старая проблема, но проблема все еще сохраняется сегодня, поэтому я опубликую, как я решил это.
проблема в том, что вызов для включения или выключения светодиода занимает переменное количество времени для прохождения через операционную систему Android. Способ обработки этих вызовов зависит от телефона.
во-первых, вам нужно измерить время, необходимое для включения и выключения светодиода, начиная с момента вызова. Используйте вход с камеры, держите телефон закройте поверхность и измерьте изменение яркости в кадре. Вы можете использовать glReadPixels при работе с OpenGL и считывать центральную линию только каждый кадр. Вам нужно будет сделать несколько измерений, так как вызов может быть короче или длиннее в зависимости от состояния ОС. Желательно, чтобы у вас не было буфера или фиксированного буфера кадров, поэтому синхронизация кадров надежна (что может быть не так с сжатием). Я использовал OpenGL и SurfaceTexture, и это быстро путь.
теперь вы знаете минимальное(1) и максимальное (2) Время, необходимое для вызова для прохождения ОС. Используя эту информацию, вы можете заставить светодиод мигать как можно быстрее на телефоне. Чтобы действительно получить максимальную отдачу, запустите второй вызов вспышки до того, как пройдет максимальное(2) Время; maximum(2) - minium(1).
используя последний трюк, скорость мигания в основном зависит от разницы в минимальном и максимальном времени обхода вызова. Это типично очень отличается на телефон, от 10ms до 100ms+.
также обратите внимание, что, поскольку измерение времени прохождения вызова происходит с камерой, время округляется вверх/вниз до 33 мс сегментов (@30fps).
У меня была такая же проблема с фонариком и проблема не связана с таймером. Речь идет о том, как вы включаете и выключаете вспышку. На некоторых устройствах, таких как 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);
может быть, вы можете попробовать использовать функции сигнализации, такие как:
https://developer.android.com/training/scheduling/alarms.html
https://developer.android.com/reference/android/provider/AlarmClock.html
ваш смогите установить период повторения для сигнала тревоги. сделать 2 будильника, один для включения и один для выключения. Даже телефон имеет тяжелую работу, будильник будет работать в зависимости от времени часов. так может это не будет Off и дважды по ошибке, но решение будет таким же.
а также вы используете 200 миллисекунд. это трудно для устройства поймать такой небольшой интервал времени. может, попробуете увеличить временные интервалы?