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

How to open device flashlight in Android N?

我正在尝试制作一个可以打开 on/off 设备手电筒的简单按钮。我不明白为什么 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 版本无关。您正在检查设备是否有相机手电筒,然后将其打开。在 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版本上都处理Camera,你应该为这些版本准备单独的代码。

根据文档:

We recommend using the new android.hardware.camera2 API for new applications.

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

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

此外,查看这些 Whosebug 线程:

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

此致