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

这样的天使

我正在尝试制作一个简单的按钮来打开/关闭设备手电筒。我不明白为什么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
    }
  }
}
皮特·维琴(Piotr Wittchen)

您的代码逻辑有误。它与任何特定的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,则应为这些版本准备单独的代码。

根据文档:

我们建议对新应用程序使用新的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);
}

此外,请检查以下StackOverflow线程:

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

问候

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

如何在Tokbox中的手电筒上设置相机灯?

尝试使用Android Camera2创建手电筒

在Android模拟器中模拟LED手电筒?

在QRcodeScanner React native中打开/关闭手电筒

导入手电筒时如何解决“无法初始化TensorProto DataType类型”错误?

相机预览开启时如何(以编程方式)保持手电筒开着

如何在旧设备中打开手电筒

在Android中以不同的模式打开手电筒

Nexus 5上的Android手电筒

手电筒(手电筒)正在打开但没有关闭

Android片段中的手电筒-SurfaceView

如何仅在Unity3d中使用C#打开/关闭android手电筒

使用kivy / python访问android手电筒(相机LED闪光灯)

在Android上打开/关闭相机手电筒

android手电筒第二次启动错误

android延迟手电筒

在手电筒中,如何在训练时间内修复预训练的嵌入?

火炬/手电筒应用程序(不建议使用android.hardware.camera)

当在Android Studio中按下按钮时,应用会从用户处获取二进制输入并闪烁手电筒以传输输入

在Android中打开不支持同时闪光的手电筒和相机

Android Studio:手电筒在关闭时崩溃

使用相机api 2的Android手电筒应用程序

在所有 Android 设备中控制手电筒

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

在 ARSession 期间打开手电筒

Kotlin 上的 Android 手电筒

我无法在 API <=22(使用 Android Studio 和 Unity)的设备中启动手电筒。为什么?

使用相机ionic 3时如何打开手电筒