Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让手电筒应用程序中的手电筒关闭?_Java_Android_Xml_Flashlight_Portable Applications - Fatal编程技术网

Java 如何让手电筒应用程序中的手电筒关闭?

Java 如何让手电筒应用程序中的手电筒关闭?,java,android,xml,flashlight,portable-applications,Java,Android,Xml,Flashlight,Portable Applications,我一直在为android开发一款手电筒应用程序,但遇到了一些问题,并已成功地解决了这些问题。但现在,当我运行应用程序时,它将加载到我的HTC one上,并正常运行,直到我第四次按下手电筒电源按钮。我可以按一下它,它就会打开。我第二次按它,它就关了。我第三次按它,它就打开了我第四次按它时,它不会关闭?帮助? public class MainActivity extends Activity { ImageButton powerButton; private Camera camera

我一直在为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;
    }
  }
" 舱单- '
Activity_main.xml-

至于您描述的症状,可能是SurfaceView崩溃。请从logcat发布您的错误日志

此外,onResume()中的代码对我来说没有意义(尽管这不是问题的直接原因,对于问题的直接原因,请再次查看日志):


我想你的意思是说如果(isFlashOn)关闭flash();但即使你纠正了这一点,这仍然是错误的。

我用来关闭手电筒的代码是:

 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;
    }
}

我知道大部分都与lol无关,但我只是想说明清单和所有内容都应该正确设置。当然。。。好吧,这有助于缩小范围并显示相关的、指向所有其他内容的帖子链接(pastebin)好的,谢谢。完成!是的,(isFlashOn)就足够了。您建议我将onResume()更改为什么?这是我的logcat的链接:对不起,logcat没有告诉我们出了什么问题。在这一点上,我只需在hasFlash/isFlashOn上设置一个断点,然后遍历它,查看结果值是否符合您在每个步骤中的预期。这将告诉你需要在onResume()中写些什么
 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;
    }
}