2016-12-16 8 views
6

Próbuję utworzyć opcję jak SOS modułu w moim app, tworzę kod do obsługi to:Opcja jak SOSModule nie działa

class SOSModule { 
private Camera camera; 
private Camera.Parameters params; 
private boolean isFlashOn; 

void blink(final int delay, final int times) { 
    Thread t = new Thread() { 
     public void run() { 
      try { 

       for (int i=0; i < times*2; i++) { 
        if (isFlashOn) { 
         turnOffFlash(); 
        } else { 
         Camera.open(); 
         turnOnFlash(); 
        } 
        sleep(delay); 
       } 

      } catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    }; 
    t.start(); 
} 

void turnOnFlash() { 
    if (!isFlashOn) { 
     if (camera == null || params == null) { 
      return; 
     } 
     params = camera.getParameters(); 
     params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(params); 
     camera.startPreview(); 
     isFlashOn = true; 
    } 

} 

void turnOffFlash() { 
    if (isFlashOn) { 
     if (camera == null || params == null) { 
      return; 
     } 
     params = camera.getParameters(); 
     params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
     camera.setParameters(params); 
     camera.stopPreview(); 
     isFlashOn = false; 
    } 
} 

}

również dodać wszystkie wymagane uprawnienia w oczywisty i oczywiście sprawdzam pozwolenia na wykorzystanie na czas.

Ale to nie działa. Po prostu tworzę inny kod, ale działa jak "jeden błysk" bez żadnego cyklu.

Czy możecie mi pomóc?

To jest dla mnie ważne, nie mogę tego zrobić, ponieważ moje Huawei p8 Lite i p9 Lite nie dają żadnych błędów, kiedy to się stało, jest to problem z oprogramowaniem Huawei, z aparatem muszę przetestować go na urządzeniu psychicznym, a jego duży problem, że nie mam żadnych dzienników z urządzeń.

public void flash_effect() throws InterruptedException 
{ 
    cam = Camera.open(); 
    final Camera.Parameters p = cam.getParameters(); 
    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 


    Thread a = new Thread() 
    { 
     public void run() 
     { 
      for(int i =0; i < 10; i++) 
      { 
       cam.setParameters(p); 
       cam.startPreview(); 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       cam.stopPreview(); 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     } 
    }; 
    a.start(); 
}} 

Ten kod działa, ale lampa jest otwarta do nieskończoności bez efektu migania Każdy pomysł ??

+0

to awarię i wyjątek lub po prostu nic nie robi na naciśnięciu przycisku SOS? –

+0

Miał podobny problem wcześniej http://stackoverflow.com/questions/39055659/thread-interrupt-alternatives –

+0

Nic się nie stało, gdy kliknę przycisk SOS – Rodriquez

Odpowiedz

0

Jego ponieważ prowadzony wątek nie jest sprawdzony

Spróbuj

void blink(final int delay, final int times) { 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 

      try { 

       for (int i=0; i < times*2; i++) { 
        if (isFlashOn) { 
         turnOffFlash(); 
        } else { 
         turnOnFlash(); 
        } 
        Thread.sleep(delay); 
       } 

      } catch (Exception e){ 
       e.printStackTrace(); 
      } 

     } 
    }); 

    t.start(); 
} 

można przeczytać więcej tutaj

Thread: Not calling run method

1

Potrzebujesz flagi, która mówi twojemu wątkowi, kiedy się zatrzymać.

boolean shouldStop = false; 

    while (!shouldStop){ 
     if(FlashOn){ 
     ...//do SOS stuff 
     } 
    } 

    public void endSOS(){ 
     shouldStop = true; 
    } 
+0

powinienem umieścić tę flagę w wątku tak? – Rodriquez

+0

W funkcji uruchamiania, tak. –

+0

Próbowałem tego, ale nie działało – Rodriquez

Powiązane problemy