iOS: Torch level on iPhone 11 Pro

亡梦爱人 提交于 2020-06-10 09:59:19

问题


I'm using AVCaptureDevice.setTorchModeOn(level) method to turn on the flashlight at variable brightness.

On my old iPhone SE it's working fine — I can clearly see 4 different brightness levels as I change level from 0 to 1.

But on the iPhone 11 Pro the flashlight turns on only when level is 1.0! And it's brightness if far from maximum level (compared to flashlight from Control Center).

I tried using maxAvailableTorchLevel constant, but results are the same as using 1.0.
Also tried values more than 1.0 — this results in exception (as expected).

Did anyone have this problem too? Maybe there are some workarounds?


回答1:


I remembered that back in the iOS 3.x days we didn't have simple LED API. We had to start a full video capture session. Well it turns out that with the iPhone 11 this seems to be the only solution. I'd love to hear about others which don't require this.

This is my tested workaround. I am using Objective C here, not Swift because that's what I used in this old app from 2009! You can easily find Swift code to start video capture (and ignore the output, it should work the same.

AVCaptureSession* session = [[AVCaptureSession alloc] init];

AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error];
if ([session canAddInput:deviceInput]) {
    [session addInput:deviceInput];
}

AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

CALayer *rootLayer = self.view.layer;
[rootLayer setMasksToBounds:YES];

CGRect frame = self.view.frame;
[previewLayer setFrame:frame];
[rootLayer insertSublayer:previewLayer atIndex:0];

//This is where you'd save the video with AVCaptureVideoDataOutput but of course we don't.

[session startRunning];

And after this you just start the LED as usual:

NSError *error = nil;

if ([inputDevice isTorchModeSupported:AVCaptureTorchModeOn])
[inputDevice setTorchModeOnWithLevel:1.0 error:&error];

This gets maximum brightness on my iPhone 11 Pro. I am now looking for the same solution without having to use the video capture (which obviously uses battery AND requires a permission, which users may not like. It needs to be explained well).




回答2:


According to the documentation for maxAvailableTorchLevel

This constant always represents the maximum available torch level, independent of the actual maximum value currently supported by the device.

If this constant always represents the maximum available torch level, we not only extract that different devices have different maximum available levels but also that the device you mention can't go higher than 1.0.

Best one can do now is to reach out to Apple's developer support.



来源:https://stackoverflow.com/questions/60197045/ios-torch-level-on-iphone-11-pro

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!