2015-11-15 2 views
0

есть люди! И здесь это идет еще один вопрос .. от меня ..Приложение Замораживает и падает при попытке мигать фонариком

Я делаю приложение для фонарика. В приложении есть две кнопки: одна для включения/выключения вспышки (flashlight_switch), а другая для мигания вспышки С одним нажатием на кнопку (sos_switch) на средняя скорость. Вспышка вкл/выкл работает отлично, но когда я нажимаю кнопку SOS, приложение замерзает и падает. А также как отключить SOS. Я новичок, поэтому было бы очень приятно, что вы подробно объясните ответ. Пожалуйста, игнорируйте любые опечатки, если они есть. Приложение проверено на Galaxy S3 и LG G3, и им не повезло.

Вот полный код:

Java:

FlashlightActivity:

public class FlashlightActivity extends Activity { 
    ImageButton flashlight_switch; 
    ImageButton sos_switch; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_flashlight); 
     flashlight_switch = (ImageButton) findViewById(R.id.flashlight_switch); 
     sos_switch = (ImageButton) findViewById(R.id.sos_switch); 

     flashlight_switch.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 

       if (Flash.getTorch()) { 
        flashlight_switch.setImageResource(R.drawable.flashlight_switch_on); 
       } else { 
        flashlight_switch.setImageResource(R.drawable.flashlight_switch_off); 
       } 
      } 
     }); 

     sos_switch.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (SOS.getSOS()) { 
        sos_switch.setImageResource(R.drawable.sos_on); 
       } else { 
        sos_switch.setImageResource(R.drawable.sos_off); 
       } 
      } 
     }); 
    } 
} 

Вспышка:

class Flash { 
private static boolean flashOnOff = false; 
private static boolean sosOnOff = false; 
public static Camera camera; 
private static Camera.Parameters params; 


public static boolean getTorch() { 
    if (flashOnOff) 
     off(); 
    else 
     on(); 
    return flashOnOff; 

} 

public static boolean getSOS() { 
    if (sosOnOff) 
     offSOS(); 
    else 
     onSOS(); 
    return sosOnOff; 

} 

private static void on() { 
    if (!flashOnOff) { 
     if (camera == null || params == null) { 
      try { 
       camera = Camera.open(); 
       params = camera.getParameters(); 
      } catch (RuntimeException e) { 
       int a = 10; 
      } 
     } 
     try { 
      camera.setPreviewTexture(new SurfaceTexture(0)); 
      params = camera.getParameters(); 
      params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(params); 
      camera.startPreview(); 
      flashOnOff = true; 

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

} 

private static void off() { 
    if (camera == null || params == null) 
     return; 
    params = camera.getParameters(); 
    params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
    camera.setParameters(params); 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
    flashOnOff = false; 
} 

private static void onSOS() { 
    Thread t = new Thread() { 
     public void run() { 
      try { 

       int delay = 50; 
       int times = 10; 
       for (int i=0; i < times*2; i++) { 
        if (flashOnOff) { 
         on(); 
        } else { 
         off(); 
        } 
        sleep(delay); 
       } 

      } catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    }; 
    t.start(); 
} 
private static void offSOS() { 
    Thread t = new Thread(); 
    t.stop();}} 

Спасибо заранее!

Update:

Я обновил свой flash.java. Теперь он не сбой, но SOS не работает, а также отключается sos-переключатель. Я не могу понять это сейчас. Пожалуйста помоги!!!! как можно быстрее!

+0

* Привет! Там Folks –

ответ

1

Вы не должны спать Thread.sleep(blinkDelay); нити, потому что это главная потребность нити обновить UI.you следует использовать другую нить для SOS на

И Ваш SOS на функции в рекурсивном бесконечной петле плзла редактировать его. Вы призывающие бесконечное время recursivly

Сделать Flash класс ON/OFF метод для общественности и сделать несколько изменений в SOS по методе on(); в Flash.on и off к Flash .off

Flash.java

class Flash { 
private static boolean flashOnOff = false; 
public static Camera camera; 
private static Camera.Parameters params; 
static Thread t; 
    public static boolean getTorch() { 
     if (flashOnOff) // turn off flash 
      off(); 
     else    // turn on flash 
      on(); 
     return flashOnOff; 

    } 

private static void on() { 
    if (!flashOnOff) { 
     if (camera == null || params == null) { 
      try { 
       camera = Camera.open(); 
       params = camera.getParameters(); 
      } catch (RuntimeException e) { 
       int a = 10; 
      } 
     } 
     try { 
      params = camera.getParameters(); 
      params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(params); 
      camera.setPreviewTexture(new SurfaceTexture(0)); 
      camera.startPreview(); 
      flashOnOff = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private static void off() { 
    if (camera == null || params == null) 
     return; 
    params = camera.getParameters(); 
    params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
    camera.setParameters(params); 
    camera.stopPreview(); 
    flashOnOff = false; 
} 
public static void onSOS() { 
    t = new Thread() { 
     public void run() { 
      try { 
       int delay = 50; 
       while (true) { 
        if (t.isInterrupted()) 
         break; 
        getTorch(); 
        sleep(delay); 
       } 

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

} 

public static void offSOS() { 
    if (!t.isInterrupted()) { 
     t.interrupt(); 
     off(); 
    } 
}} 

FlashlightActivity.java

public class FlashlightActivity extends Activity { 
ImageButton flashlight_switch; 
ImageButton sos_switch; 
boolean isStart = false; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_flashlight); 
     flashlight_switch = (ImageButton) findViewById(R.id.flashlight_switch); 
     sos_switch = (ImageButton) findViewById(R.id.sos_switch); 
    flashlight_switch.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 

      if (Flash.getTorch()) { 
       flashlight_switch.setImageResource(R.drawable.flashlight_switch_on); 
      } else { 
       flashlight_switch.setImageResource(R.drawable.flashlight_switch_off); 
      } 
     } 
    }); 

    sos_switch.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (!isStart){ 
     Flash.onSOS(); 
     isStart = true; 
     sos_switch.setImageResource(R.drawable.sos_off); 
    }else{ 
     Flash.offSOS(); 
     isStart = false; 
     sos_switch.setImageResource(R.drawable.sos_on); 
    } 
     } 
    }); 
} 

+0

Еще раз спасибо брату! Что делать, если я реализую метод sos только в классе flash? Что вы подразумеваете под словом «И ваша функция SOS в рекурсивном бесконечном цикле?» Отредактируйте его? И как отключить SOS? –

+0

, когда запускается метод «on» SOS, вы снова вызываете метод «on» и «if (myString.charAt (i) == '0») «снова будет истинным, и снова ваш метод« on »будет запущен ... it будет запускаться снова и снова ... так что «ваша функция SOS включена в рекурсивном бесконечном цикле» –

+0

Я обновил свой flash.java, но он все еще не работает, и да, он не сбой теперь, но он пытается мигать фонариком один раз, когда я поворачиваюсь многократного включения/выключения фонарика.Я не могу понять это сейчас. Помощь PLS !!!! и да, кнопка sos замерзает, когда-то постучал ....... –

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