Как отключить фонарик в приложении фонарик?

Я делал приложение-фонарик для Android и столкнулся с несколькими проблемами, и до сих пор смог их исправить. Но теперь, когда я запускаю приложение, оно загружается на моем HTC one и работает нормально, пока я не нажму кнопку включения фонарика в четвертый раз. Я могу нажать один раз, и он включится. Нажимаю второй раз и он выключается. Нажимаю третий раз и снова включается. Я нажимаю четвертую и она не выключается? Помочь?

public class MainActivity extends Activity {

  ImageButton powerButton;
  private Camera camera;
  private boolean isFlashOn;
  private boolean hasFlash;
  Parameters params;

  @TargetApi(Build.VERSION_CODES.ECLAIR)
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    powerButton = (ImageButton) findViewById(R.id.power_button);

    hasFlash = getApplicationContext().getPackageManager()
    .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

    if (!hasFlash) {
      AlertDialog alert = new AlertDialog.Builder(MainActivity.this)
      .create();
      alert.setTitle("Notice");
      alert.setMessage("I'm sorry, your device doesn't support flashlight!");
      alert.setButton("Done", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
          finish();
        }
      });
      alert.show();
      return;
    }

    getCamera();

    toggleButtonImage();



    powerButton.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        if (isFlashOn) {
          turnOffFlash();
        } else {
          turnOnFlash();
        }
      }
    });
  }


  private void getCamera() {
    if (camera == null) {
      try {
        camera = Camera.open();
        params = camera.getParameters();
      } catch (RuntimeException e) {
        Log.e("Failed to open camera. Alert: ", e.getMessage());
      }
    }
  }


  public void turnOnFlash() {
    if (!isFlashOn) {
      if (camera == null || params == null) {
        return;
      }

      params = camera.getParameters();
      params.setFlashMode(Parameters.FLASH_MODE_TORCH);
      camera.setParameters(params);
      camera.startPreview();
      isFlashOn = true;

      toggleButtonImage();
    }

  }

  private void turnOffFlash() {
    if (isFlashOn) {
      if (camera == null || params == null) {
        return;
      }

      params = camera.getParameters();
      params.setFlashMode(Parameters.FLASH_MODE_OFF);
      camera.setParameters(params);
      camera.stopPreview();
      isFlashOn = false;

      toggleButtonImage();
    }
  }

  private void toggleButtonImage(){
    if(isFlashOn){
      powerButton.setImageResource(R.drawable.flashlight_on);
    }else{
      powerButton.setImageResource(R.drawable.flashlight_off);
    }
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
  }

  @Override
  protected void onPause() {
    super.onPause();
    turnOffFlash();
  }

  @Override
  protected void onRestart() {
    super.onRestart();
  }

  @Override
  protected void onResume() {
    super.onResume();
    if(hasFlash)
      turnOffFlash();
  }

  @Override
  protected void onStart() {
    super.onStart();

    getCamera();
  }

  @Override
  protected void onStop() {
    super.onStop();

    if (camera != null) {
      camera.release();
      camera = null;
    }
  }

' Манифест — http://pastebin.com/Tw6LTemP ' Activity_main.xml — http://pastebin.com/Tga1agN7


person Coleman Tyler    schedule 30.04.2014    source источник
comment
Я знаю, что большая часть этого не имеет отношения к делу, лол, но я просто показывал, что манифест и все остальное должно быть настроено правильно.   -  person Coleman Tyler    schedule 30.04.2014
comment
Конечно... ну, это помогает сузить и показать релевантные, публиковать ссылки на все остальное (pastebin)   -  person Caffeinated    schedule 30.04.2014
comment
Хорошо, спасибо. Сделанный!   -  person Coleman Tyler    schedule 30.04.2014


Ответы (2)


Что касается симптома, который вы описываете, это, вероятно, сбой SurfaceView. Пожалуйста, опубликуйте свой журнал ошибок из logcat.

Кроме того, ваш код внутри onResume() не имеет для меня смысла (хотя это не прямая причина вашей проблемы, для прямой причины вашей проблемы, пожалуйста, снова посмотрите свой логарифм):

@Override
protected void onResume() {
super.onResume();
if(hasFlash)
    turnOffFlash();
}

Я думаю, вы хотели сказать if (isFlashOn) turnOffFlash(); но даже если вы поправите это на это, это все равно неправильно.

person Stephan Branczyk    schedule 30.04.2014
comment
Да, (isFlashOn) было бы гораздо больше. Что бы вы предложили изменить onResume() на? и вот ссылка на мой logcat: pastebin.com/sUS3tqDf - person Coleman Tyler; 03.05.2014
comment
Извините, logcat не говорит нам, что не так. На этом этапе я бы просто установил точку останова на hasFlash/isFlashOn и просмотрел ее, чтобы увидеть, соответствует ли полученное значение вашим ожиданиям на каждом шаге. Это скажет вам, что вам нужно написать в onResume() - person Stephan Branczyk; 03.05.2014

Код, который я использую для выключения фонарика:

 private 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;
    }
}
person Elio Lako    schedule 04.03.2019