Я некоторое время работал над приложением азбуки Морзе, и у меня возникли проблемы с тем, чтобы вспышка камеры, ну... вспыхнула. Моя конечная цель состоит в том, чтобы напечатать краткое сообщение, нажать одну кнопку и заставить светодиод мигать сообщением азбукой Морзе, проходя через введенное пользователем сообщение как 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(). Насколько я понимаю, это приведет к спячке всего потока пользовательского интерфейса (поскольку это единственный поток, который я использую), и это плохая практика. Есть ли другие решения моей проблемы? Я бегло просмотрел несколько тем, но быстро был ошеломлен и не был уверен, что это был святой Грааль ответов, на которые я надеялся.
Заранее благодарю за любой совет!