我想检查火炬是否打开。首先,我打开控制中心然后打开火炬。接下来我运行我的应用程序并执行我的火炬测试。我得到像这样的AVCaptureDevice:
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
然后我检查设备对象的各种属性,如:
但是我总是把火炬关掉。您是否需要任何许可才能阅读此属性,或者还有其他方法可以检查火炬是否打开?
答案 0 :(得分:2)
查看AVCaptureDevice Class reference,您可能还需要/需要检查首先是否存在火炬(hasTorch
),以及它是否可用/支持({{1} })。
属性torchAvailable
是一个只读Bool,因此访问它不会有任何问题,但文档说:
设备上必须存在火炬,并且当火炬可以激活之前当前可用。
所以也许你首先需要检查这两个属性?看起来很傻,但是......
的OBJ-C:
torchActive
夫特:
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")
}
答案 1 :(得分:1)
虽然这在技术上没有解决问题,但这是用于确定割炬状态变化的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无济于事。这是一个真正的问题,因为我想在接管AVCaptureDevice的控制权时已经开启火炬。