iOS检查火炬是否开启

我想检查火炬是否开启。 首先,我打开控制中心,然后打开火炬。 接下来我运行我的应用程序并执行我的火炬testing。 我得到这样的AVCaptureDevice:

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

然后我检查设备对象的各种属性,如:

  • torchLevel
  • torchActive
  • torchMode
  • flashActive
  • flashMode

但我总是得到那个火把熄灭。 你需要任何权限阅读这个属性,或者有另一种方法来检查火炬是否开启?

虽然这在技术上并不能解决问题,但这是确定火炬状态变化的KVO代码。 也许这可能有帮助。 我试图解决同样的问题,但无法访问有关从控制中心打开的火炬的任何信息。 看起来应该有一些其他的方式使用KVO或其他东西来知道火炬是否目前活跃或没有。

 static void * const torchActiveObservationContext = (void*)&torchActiveObservationContext; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == torchActiveObservationContext) { AVCaptureDevice *thisDevice = (AVCaptureDevice*)object; NSLog( @"Current torch level: %f", thisDevice.torchActive); } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } -(id) init { if (self = [super init]) { AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; [videoDevice addObserver:self forKeyPath:@"torchActive" options:NSKeyValueObservingOptionNew context:torchActiveObservationContext]; // whatever other initialization code ... } return self; } 

我也尝试使用torchLevel和torchMode无济于事。 这是一个真正的问题,因为如果在接pipeAVCaptureDevice的控制时,我想离开火炬。

查看AVCaptureDevice类的参考 ,你可能还需要/需要检查一个火炬是否存在( hasTorch ),如果它是可用/支持( torchAvailable )。

属性torchActive是一个只读的布尔,所以不应该有任何问题访问它,但文档说:

手电筒必须存在于设备上,并且可以在活动之前可用。

所以也许你首先需要检查这两个属性? 看起来很傻,但是…

OBJ-C:

  AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (device.hasTorch && device.torchAvailable) NSLog("%ld", device.torchMode) //an NSInteger in an enum } else { NSLog("Torch not present/available") } 

迅速:

 let device: AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) if (device.hasTorch && device.torchAvailable){ println(device.torchMode.rawValue) //print enum Int value } else { println("Torch not present/available") }