AVCaptureSession зависает при включении горелки - PullRequest
0 голосов
/ 12 сентября 2018

В нашем приложении для iOS есть функция сканирования штрих-кода, и мы даем клиенту возможность включать и выключать фонарик по мере необходимости. На iPhone X (и только на iPhone X), когда AvCaptureSession запущен и факел включен, захват видео на экране останавливается. Как только факел снова выключается, захват видео начинается снова. Кто-нибудь сталкивался с этим? Кажется, я не могу найти ничего, что указывало бы на работу вокруг. Хотите знать, если это ошибка iPhone X?

1 Ответ

0 голосов
/ 29 ноября 2018

Я столкнулся с этой проблемой. После некоторых экспериментов выяснилось, что получение устройства для настройки факела должно выполняться точно так же, как вы получаете устройство при настройке AVCaptureSession. E.G.:

    let captureSession = AVCaptureSession()
    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)

        guard let captureDevice = deviceDiscoverySession.devices.first else {
            print("Couldn't get a camera")
            return
        }
     do {
            let input = try AVCaptureDeviceInput(device: captureDevice)
            captureSession!.addInput(input)
        } catch {
            print(error)
            return
        }

Используйте этот точный метод для получения устройства при включении и выключении горелки (фонарика). В этом случае строки:

let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)

guard let device = deviceDiscoverySession.devices.first

Пример:

func toggleTorch() {

    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)

    guard let device = deviceDiscoverySession.devices.first
        else {return}

    if device.hasTorch {
        do {
            try device.lockForConfiguration()
            let on = device.isTorchActive
            if on != true && device.isTorchModeSupported(.on) {
                try device.setTorchModeOn(level: 1.0)
            } else if device.isTorchModeSupported(.off){
                device.torchMode = .off
            } else {
                print("Torch mode is not supported")
            }
            device.unlockForConfiguration()
        } catch {
            print("Torch could not be used")
        }
    } else {
        print("Torch is not available")
    }
}

Я понимаю, что некоторый код может быть лишним в функции toggleTorch, но я оставляю его. Надеюсь, это поможет.

...