我正在尝试制作一个简单的按钮来打开/关闭设备手电筒。我不明白为什么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,则应为这些版本准备单独的代码。
根据文档:
我们建议对新应用程序使用新的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] 删除。
我来说两句