Ошибка в логике вашего кода. Это не связано с какой-либо конкретной версией 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 и Static Code Analysis, вам нужно добавить аннотацию @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);
}
Кроме того, проверьте эти потоки StackOverflow:
Они могут быть полезны при решении вашей проблемы.
С уважением
person
Piotr Wittchen
schedule
06.11.2016