iOS检查火炬是否打开

时间:2015-02-02 19:19:41

标签: ios

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

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

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

  • torchLevel
  • torchActive
  • torchMode
  • flashActive
  • flashMode

但是我总是把火炬关掉。您是否需要任何许可才能阅读此属性,或者还有其他方法可以检查火炬是否打开?

2 个答案:

答案 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的控制权时已经开启火炬。