Как открыть фонарик устройства в 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
    }
  }
}

person Tal Angel    schedule 05.11.2016    source источник
comment
Этот код работает? У вас есть проблемы с запуском на устройстве с определенной версией Android? Который из? В теме вы спрашивали про Android N и в сообщении упомянули старые версии Android, что смущает.   -  person Piotr Wittchen    schedule 06.11.2016
comment
У меня Samsung Galaxy S5, я могу включить фонарик своего устройства, но не могу его выключить. В моем коде есть строки, показывающие, что объект Camera устарел, и я не знаю, что делать.   -  person Tal Angel    schedule 06.11.2016
comment
Хорошо, теперь я понимаю вашу проблему. Я разместил обычный ответ ниже. Вы можете проверить это. Надеюсь, это поможет.   -  person Piotr Wittchen    schedule 07.11.2016


Ответы (1)


Ошибка в логике вашего кода. Это не связано с какой-либо конкретной версией 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
comment
Спасибо за ваше время, но объект Camera (из Android.Hardware.Camera) устарел. Я хочу получить код, который будет работать со всеми устройствами и каждым API. - person Tal Angel; 07.11.2016
comment
@TalAngel Я улучшил свой ответ. Думаю, теперь будет полезнее. - person Piotr Wittchen; 07.11.2016
comment
Да, это так. Дзенки! - person Tal Angel; 07.11.2016