如何在 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 线程:
他们在处理您的问题时可能会有所帮助。
此致
我正在尝试制作一个可以打开 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 线程:
他们在处理您的问题时可能会有所帮助。
此致