检测到运动时切换手电筒

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 可能会解决您的问题。

【讨论】:

以上是关于检测到运动时切换手电筒的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-native (expo) 切换手电筒

在后台运行安卓手电筒

如何根据检测到颤振应用程序中的锁定或关闭屏幕采取行动

从Web浏览器打开/关闭移动手电筒

手电筒片段 Android Studio

如何快速打开和关闭手电筒?