2016-11-03 2 views
0

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

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

+0

Возможный дубликат [Android Как быстро мигать светодиод/фонарик] (http://stackoverflow.com/questions/16348418/android-how-to-blink-led-flashlight-rapidly) –

ответ

-1

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

  1. Проверьте права доступа, специфичные для cameraFlashlight

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

+0

Спасибо за комментарий, но, к сожалению, он не помогло. У меня была функция разрешения и использования, уже присутствующая в манифесте, чтобы сделать простую часть фонарика частью приложения. Рабочий код, подтверждающий это, находится в моем первоначальном посте. Я также попытался импортировать .camera2 вместо API .camera, но Android Studio не распознает его как правильный импорт. –

Смежные вопросы