如何在手电筒应用程序中关闭手电筒?

4

我一直在为安卓制作手电筒应用程序,并遇到了几个问题,到目前为止已经解决了它们。但是现在,当我运行该应用程序时,它会在我的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 ' 主活动布局文件 - http://pastebin.com/Tga1agN7


1
我知道大部分内容都不相关哈哈,但我只是想展示清单和一切都应该设置正确。 - Coleman Tyler
当然,这有助于缩小范围并显示相关内容,可以将其他所有内容的链接(pastebin)发布。 - Caffeinated
1
好的,谢谢。完成了! - Coleman Tyler
2个回答

1
关于您描述的症状,可能是SurfaceView崩溃了。请在logcat中发布您的错误日志。
此外,您在onResume()中的代码对我来说没有意义(尽管这不是您问题的直接原因,请再次查看您的logcat):
@Override
protected void onResume() {
super.onResume();
if(hasFlash)
    turnOffFlash();
}

我认为你的意思是如果(isFlashOn) turnOffFlash(); 但即使你将其更正为这样,它仍然是错误的。

是的,(isFlashOn)会更加充分。您建议我将onResume()更改为什么?这是我的logcat链接:http://pastebin.com/sUS3tqDf - Coleman Tyler
抱歉,logcat 没有告诉我们出了什么问题。此时,我会在 hasFlash/isFlashOn 上设置一个断点,并逐步检查结果值是否与每个步骤的预期相匹配。这将告诉您需要在 onResume() 中编写什么。 - Stephan Branczyk

1
我正在使用的代码来关闭手电筒是:
 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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接