检测到运动时切换手电筒
Posted
技术标签:
【中文标题】检测到运动时切换手电筒【英文标题】:Toggle Flashlight when Motion is detected 【发布时间】:2011-11-17 22:47:34 【问题描述】:我目前正在做一个小项目,该项目/应用程序的含义是,如果您要摇动设备,闪光灯就会点燃。如果你再次摇晃它,灯就会熄灭!
前 3/4 开关在开灯或关灯之间工作正常,但在 3/4 开关之后,由于设备未检测到晃动,因此无法再关灯。
另一个小问题(自 ios 5.0 起)是,如果检测到动作,闪光灯会闪烁很短的时间(1 秒)然后开机。这看起来像一个短暂的闪光。
我做错了什么
检测抖动:
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
if (event.type == UIEventSubtypeMotionShake)
NSLog(@"shaken, not stirred.");
[self playSound];
[self toggleFlashlight];
切换 Flash 灯:
- (void)toggleFlashlight
AVCaptureDevice *device =
[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch] && [device hasFlash])
if (device.torchMode == AVCaptureTorchModeOff)
NSLog(@"It's currently off.. turning on now.");
AVCaptureDeviceInput *flashInput =
[AVCaptureDeviceInput deviceInputWithDevice:device error: nil];
AVCaptureVideoDataOutput *output =
[[AVCaptureVideoDataOutput alloc] init];
AVCaptureSession *session =
[[AVCaptureSession alloc] init];
[session beginConfiguration];
[device lockForConfiguration:nil];
[device setTorchMode:AVCaptureTorchModeOn];
[device setFlashMode:AVCaptureFlashModeOn];
[session addInput:flashInput];
[session addOutput:output];
[device unlockForConfiguration];
[output release];
[session commitConfiguration];
[session startRunning];
[self setAVSession:session];
[session release];
else
NSLog(@"It's currently on.. turning off now.");
[AVSession stopRunning];
非常感谢您为我解决问题的专业知识!
【问题讨论】:
【参考方案1】:好吧,我对此了解不多,但您可能太快地开始/停止会话(在上次调用 ToggleFlashLight 后过早调用它)。您可能会看到this code here... 它建议您执行所有操作(Torch/FlashModeOn 除外)一次以创建会话,然后只需执行 lock/torchModeOn/flashModeOn/unlock 即可打开并 lock/torchModeOff/flashModeOff/unlock关闭。
【讨论】:
【参考方案2】:调用你的代码
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
而不是 motionEnded 可能会解决您的问题。
【讨论】:
以上是关于检测到运动时切换手电筒的主要内容,如果未能解决你的问题,请参考以下文章