Вспышка не выключается при нажатии кнопки (приложение Flashlight)

java android button flashlight

120 просмотра

1 ответ

У меня есть 3 кнопки на интерфейсе. On, Off and SOS(мигать с повторяющимися интервалами). Если я нажимаю кнопку «Вкл.», А затем кнопку «Выкл.», Вспышка выключается, как и ожидалось. Но если я нажимаю SOS (она мигает, как ожидается, через равные промежутки времени), а затем выключается, она перестает мигать. Код выглядит следующим образом:

SOSbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    try {
                SOSon = true;
                startSOS();
                onSOSPress();
            } catch (Exception ex) {
                throw ex;
            }
            }
        });
void onSOSPress() {
            try {
              Flashlight flashlight=new Flashlight();
                SOSon = true;
                   flashlight.Flashthread = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                for (int i = 0; i < System.currentTimeMillis(); i++) {
                                    while (!FlashThreadStop) {
                                        if (FlashOn) {
                                           myParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
                                            try {
                                                myCamera.setParameters(myParameters);
                                            }
                                            catch (Exception ex)
                                            {
                                                //logger.log(Level.SEVERE, "an exception was thrown", ex);
                                            }
                                           myCamera.stopPreview();
                                           FlashOn = false;
                                        } else {
                                            TurnOnFlash();
                                        }
                                        try {
                                            Thread.sleep(100);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }
                                    }

                                }
                            }
                        });
                       flashlight.Flashthread.start();
            } catch (Exception ex) {
                throw ex;
            }
        }

и механизм TurnOff выглядит следующим образом:

off.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                if (FlashOn) {

                    // turn off flash
                    TurnOffFlash();

                } 
            }
        });

private void TurnOffFlash() {

        if (FlashOn) {

            if (myCamera == null || myParameters == null) {
                return;

            }

            myParameters = myCamera.getParameters();
            myParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
            myCamera.setParameters(myParameters);
            myCamera.stopPreview();
            FlashOn = false;

        }
    }
void endSOS(){
        FlashThreadStop=true;
    }
    void startSOS(){
        FlashThreadStop=false;
    }

РЕДАКТИРОВАТЬ: метод onSOSPress () был обновлен, чтобы отразить рабочий режим SOS (кнопка OFF теперь работает)

Автор: Anurag Joshi Источник Размещён: 08.11.2019 11:14

Ответы (1)


0 плюса

Ваш TurnOffFlashметод не очень хорошо справляется с миганием вспышки. Вы не останавливаете поток, поэтому он продолжает мигать взад и вперед. Вам нужно добавить одну строку, чтобы покрыть эту часть:

Flashthread.interrupt();

Таким образом вы сохраните свою функциональность, отключив флеш-память, и если поток работает в режиме SOS, вы также остановите его.

Примечание: вы не соблюдаете стандартную номенклатуру Java, где методы и переменные начинаются со строчной буквы и используются camelCase.

Автор: Vucko Размещён: 20.08.2016 11:40
Вопросы из категории :
32x32