Как заставить светодиод камеры мигать несколько раз?

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

Заранее благодарю за любой совет!


person Jeff.H    schedule 03.11.2016    source источник
comment
Возможный дубликат Android Как быстро мигать светодиодом/фонариком   -  person Manfred Radlwimmer    schedule 28.03.2017


Ответы (1)


Мне приходят на ум две вещи.

  1. Проверьте разрешения, специфичные для камерыFlashlight

    <permission android:name="android.permission.FLASHLIGHT"
     android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
     android:protectionLevel="normal"/>
    <uses-feature android:name="android.hardware.camera" />
    
  2. Попробуйте использовать API android.hardware.camera2, поскольку API камеры устарело с уровня Android API 21.

person amol mhatre    schedule 07.11.2016
comment
Спасибо за комментарий, но, к сожалению, он не помог. У меня уже было разрешение и функция использования в манифесте, чтобы простая часть приложения с фонариком работала. Рабочий код, подтверждающий это, находится в моем исходном посте. Я также попытался импортировать .camera2 вместо .camera API, но Android Studio не распознает его как правильный импорт. - person Jeff.H; 08.11.2016