iOS检查手电筒是否打开

fnvucqvd  于 2023-01-18  发布在  iOS
关注(0)|答案(2)|浏览(217)

bounty将在7天后过期。回答此问题可获得+400声望奖励。Jaroslaw K.希望引起更多人对此问题的关注:问题还没解决,快把我逼疯了

我想检查torch是否打开。首先,我打开Control Center,然后打开torch。接下来,我运行我的应用程序并执行torch测试。我得到的AVCaptureDevice如下所示:

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

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

  • Torch 级别
  • Torch 激活
  • Torch 模式
  • 闪存激活
  • 闪光模式

但我总是得到的 Torch 是关闭的。你需要任何权限来阅读此属性或也许有另一种方法来检查 Torch 是否打开?

jrcvhitl

jrcvhitl1#

虽然这不能从技术上解决问题,但这是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的控制权时,如果 Torch 已经打开,就让它打开。

g0czyy6m

g0czyy6m2#

查看AVCaptureDevice类参考,您可能还希望/需要首先检查手电筒是否存在(hasTorch),以及它是否可用/受支持(torchAvailable)。
属性torchActive是一个只读的Bool,所以访问它应该没有任何问题,但是文档说:
手电筒必须存在于设备上并且当前可用,然后才能激活。
所以也许你首先需要检查那两处房产?听起来很傻,但是...
目标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")
}

相关问题