检测到动作时切换手电筒

时间:2011-11-17 22:47:34

标签: iphone objective-c xcode ios5 motion-detection

我目前正在开发一个小项目,项目/应用程序的意思是,如果你要摇动设备闪光灯点燃。如果你再摇一摇,灯会熄灭!

开灯或关灯之间的前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];
        }
    }
    }

我非常感谢您为我解决问题的专业知识!

2 个答案:

答案 0 :(得分:2)

嗯,我对此并不了解,但是你可能会过快地开始/停止会话(在最后一次调用后很快调用ToggleFlashLight)。你可能会看到this code here...它表明你做了所有这些(除了Torch / FlashModeOn)一次创建会话,然后只需要执行lock / torchModeOn / flashModeOn / unlock来打开并锁定/ torchModeOff / flashModeOff /解锁以关闭。

答案 1 :(得分:1)

中调用您的代码
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

而不是motionEnded可能会解决您的问题。