如何在 Android N 中打开设备手电筒?

Posted

技术标签:

【中文标题】如何在 Android N 中打开设备手电筒?【英文标题】:How to open device flashlight in Android N? 【发布时间】:2017-03-19 12:52:51 【问题描述】:

我正在尝试制作一个简单的按钮来打开/关闭设备手电筒。我不明白为什么 android.hardware.camera 已经过时了。为了使我的代码在所有设备以及具有旧版本 Android 的设备上运行,我必须做些什么?

这是我的代码:

if (IsFlashlightOn)

  if (getPackageManager().hasSystemFeature(
        PackageManager.FEATURE_CAMERA_FLASH)) 
  
    cam = Camera.open();
    Camera.Parameters p = cam.getParameters();
    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    cam.setParameters(p);
    cam.startPreview();
  
  else
  
    try
    
      cam.stopPreview();
      cam.release();
      cam = null;
    
    catch (Exception ex)
    
      // Ignore the exception
    
  

【问题讨论】:

这段代码有效吗?在具有特定 Android 版本的设备上运行它是否有问题?哪一个?在您询问有关 Android N 的主题中以及在您提到旧 Android 版本的消息中,令人困惑的是什么。 我有一个三星 Galaxy S5,我可以让我的设备手电筒打开,但我不能让它关闭。我的代码中有几行代码显示 Camera 对象已过时,我不知道该怎么办。 好的,现在我明白你的问题了。我在下面发布了常规答案。你可以检查一下。我希望它会有所帮助。 【参考方案1】:

您的代码逻辑有误。它与任何特定的 Android 版本无关。您正在检查设备是否有相机手电筒,然后将其打开。在else 块中,您将在设备没有相机手电筒的情况下关闭相机手电筒如果您的设备实际上有手电筒,这将永远不会发生

我认为代码应该如下所示。它将切换手电筒(打开时打开,关闭时关闭,打开时关闭)。

boolean isFlashlightOn = false;
boolean deviceHasCameraFlash = getPackageManager().hasSystemFeature(
                                 PackageManager.FEATURE_CAMERA_FLASH);

if(deviceHasCameraFlash) 
  Camera camera = Camera.open();
  Camera.Parameters parameters = camera.getParameters();

  if(isFlashlightOn)  
    // turn the flashlight off
    parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
    camera.setParameters(parameters);
    camera.stopPreview();
    isFlashlightOn = false;
   else 
    // turn the flashlight on
    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    camera.setParameters(parameters);
    camera.startPreview();
    isFlashlightOn = true;
  

我现在无法测试此代码,但我认为它应该可以工作,您现在应该了解总体思路并根据您的目的进行调整。

为避免在 IDE 和静态代码分析工具中出现警告,您需要在已弃用的代码中添加 @SuppressWarnings("deprecation") 注释。我们需要保留它以便向后兼容旧的 Android 版本。

如果您想在新旧 Android 版本上处理相机,您应该为这些版本准备单独的代码。

根据文档:

我们建议使用新的android.hardware.camera2 API 应用程序。

这意味着你应该按照以下方式进行:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
  // code for lollipop devices or newer
 else 
  // code for pre-lollipop devices

使用新 API 切换手电筒的代码如下所示:

private void toggleFlashLight(boolean isFlashlightOn) 
  CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
  String cameraId = camManager.getCameraIdList()[0]; // Usually front camera is at 0 position.
  camManager.setTorchMode(cameraId, isFlashlightOn);

此外,请查看这些 *** 线程:

Android camera android.hardware.Camera deprecated Android Turn on/off Camera Flash Programatically with Camera2

它们在处理您的问题时可能会有所帮助。

问候

【讨论】:

感谢您的宝贵时间,但对象相机(来自 Android.Hardware.Camera)已过时。我希望得到一个适用于所有设备和每个 api 的代码。 @TalAngel 我改进了我的答案。我想,现在会更有帮助。 是的,确实如此。 Dzięki!

以上是关于如何在 Android N 中打开设备手电筒?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何检查设备是不是有闪光灯 LED android

如何打开安卓设备的前置手电筒(不是后置手电筒)

Android如何知道手电筒是不是打开

如何在android中增加和减少手电筒亮度

如何在不破坏相机应用程序的情况下在Android手机上打开手电筒[重复]