Переключить фонарик при обнаружении движения - PullRequest
1 голос
/ 18 ноября 2011

В настоящее время я работаю над небольшим проектом, смысл проекта / приложения в том, что если вы встряхиваете устройство, вспышка загорается.Если вы снова встряхиваете, свет выключается!

Первые 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];
    }
}

Переключение вспышки:

- (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 ]

2 голосов
/ 18 ноября 2011

Ну, я не знаю много об этом, но, возможно, вы слишком быстро запускаете / останавливаете сеанс (слишком быстро вызывая ToggleFlashLight после последнего вызова).Вы можете увидеть этот код здесь ... Он предлагает сделать все это (за исключением Torch / FlashModeOn) один раз, чтобы создать сеанс, а затем просто выполнить блокировку / torchModeOn / flashModeOn / unlock, чтобы включитьи заблокировать / torchModeOff / flashModeOff / unlock, чтобы выключить.

1 голос
/ 18 ноября 2011

Вызов вашего кода в

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

вместо motionEnded может решить ваши проблемы.

...