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

Posted

技术标签:

【中文标题】如何让手电筒应用程序中的手电筒关闭?【英文标题】:How do i get torch in flashlight app to turn off? 【发布时间】:2014-06-17 05:16:27 【问题描述】:

我一直在为 android 制作手电筒应用程序,但遇到了几个问题,并且到目前为止能够修复它们。但是现在,当我运行该应用程序时,它会加载到我的 HTC 上并运行良好,直到我第四次按下手电筒电源按钮。我可以按一次它,它会打开。我第二次按下它,它就关闭了。我第三次按它,它又亮了。 我按了第四次,它不会关闭?帮忙?

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

【问题讨论】:

我知道其中的大部分内容都不相关,哈哈,但我只是展示了清单和所有内容都应该正确设置。 当然...嗯,它有助于缩小范围并显示相关,发布到所有其他内容的链接(pastebin) 好的,谢谢。完成! 【参考方案1】:

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

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

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

我想你的意思是说 if (isFlashOn) turnOffFlash();但即使你纠正它,那仍然是错误的。

【讨论】:

是的,(isFlashOn) 就足够了。您建议我将 onResume() 更改为什么?这是我的 logcat 的链接:pastebin.com/sUS3tqDf 抱歉,logcat 没有告诉我们出了什么问题。在这一点上,我只是在 hasFlash/isFlashOn 上设置了一个断点,并通过它查看结果值是否符合您在每一步的期望。这会告诉你需要在 onResume() 中写什么【参考方案2】:

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

 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;
    

【讨论】:

以上是关于如何让手电筒应用程序中的手电筒关闭?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速打开和关闭手电筒?

设备屏幕关闭时如何打开手电筒?

如何根据检测到颤振应用程序中的锁定或关闭屏幕采取行动

使用相机时如何打开/关闭手电筒?

CameraX 库如何打开/关闭手电筒?

在后台运行安卓手电筒