Я уже давно работаю над программным кодом Morse Code, и у меня возникают проблемы с тем, что камера вспыхивает, ну ... вспышка. Моя конечная цель - набрать краткое сообщение, нажать одну кнопку, а светодиодный индикатор начнет мигать сообщением в коде Морзе, пройдя через введенное пользователем сообщение как CharArray или что-то в этом роде. Пользователь также должен иметь возможность отменить процесс в любое время во время мигания/перевода. Я могу включить и выключить свет одним нажатием кнопки переключения с этим кодом.Как сделать светодиод фотоаппарата несколько раз мигающим?
mToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
if (checked) {
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
} else {
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
camera.release();
}
}
});
И я получил светодиод, чтобы включить, подождать заданное время задержки, затем выключается с одним нажатием кнопки с этим кодом с помощью обработчика и postDelayed().
Camera camera;
public void flash(int delay) {
camera = Camera.open();
final Camera.Parameters parameters = camera.getParameters();
Handler handler = new Handler();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
handler.postDelayed(new Runnable() {
public void run() {
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
camera.release();
}
}, delay);
}
Но если я пытаюсь запустить выше функция вспышки несколько раз на одной и той же нажатием кнопки я получаю следующее сообщение об ошибке в Camera.open(); линии в начале второго вызова функции.
java.lang.RuntimeException: Сбой подключения к службе камеры
Я сделал много исследований о том, как достичь своей цели нескольких вспышек и лучший/единственным жизнеспособным решением является использование Thread.sleep(). Я понимаю, что это сгорит весь поток пользовательского интерфейса (так как это единственный поток, который я использую), и это плохая практика. Есть ли другие решения для моей проблемы? Я кратко взглянул на несколько потоков, но быстро переполнился и не был уверен, что это был святой грааль ответов, на которые я надеялся.
Заранее благодарим за любой совет!
Возможный дубликат [Android Как быстро мигать светодиод/фонарик] (http://stackoverflow.com/questions/16348418/android-how-to-blink-led-flashlight-rapidly) –