Как я могу сделать фонарик / вспышку надежным при работе в многозадачном режиме? - PullRequest
1 голос
/ 21 сентября 2011

Когда я покидаю приложение и возвращаюсь в состояние «включено», иногда оно работает нормально, если включить фонарик / вспышку, но в большинстве случаев оно либо мигает, либо остается выключенным.

AppDeligate.m

- (id) init {
torchState = TRUE;
if( (self=[super init] )) {
    /// initialize flashlight
    // test if this class even exists to ensure flashlight is turned on ONLY for iOS 4 and above
    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
    if (captureDeviceClass != nil) {

        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        if ([device hasTorch] && [device hasFlash]){

            if (device.torchMode == AVCaptureTorchModeOff) {

                NSLog(@"Setting up flashlight for later use...");

                AVCaptureDeviceInput *flashInput = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil];
                AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];

                AVCaptureSession *session = [[AVCaptureSession alloc] init];

                [session beginConfiguration];
                [device lockForConfiguration:nil];

                [session addInput:flashInput];
                [session addOutput:output];

                [device unlockForConfiguration];

                [output release];

                [session commitConfiguration];
                [session startRunning];

                [self setTorchSession:session];
                [session release];
            }

        }

    } 
} 
return self;
}

- (void)toggleTorch {
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    [device lockForConfiguration:nil];
    // For the first 4 to 5 times comming back from multiask this first if hits and works properly

    if (torchState == TRUE && device.torchMode == AVCaptureTorchModeOff) {
        NSLog(@"AVCaptureTorchModeOff setting On");
        // On the 4th or 5th time it flashes and stays off or does nothing staying OFF
        // even though the NSLog fires

        [device setTorchMode:AVCaptureTorchModeOn];
        [device setFlashMode:AVCaptureFlashModeOn];

    } else if (torchState == TRUE && device.torchMode == AVCaptureTorchModeOn) {
        // Sometimes this randomly fires and every time ErrorNotification fires too
        NSLog(@"AVCaptureTorchModeOn");
        if (AVCaptureSessionRuntimeErrorNotification) {
            NSLog(@"ERROR"); 
            // Try to force but doesn't do anything
            [device setTorchMode:AVCaptureTorchModeOn];
            [device setFlashMode:AVCaptureFlashModeOn];
        }    
    } else {
        NSLog(@"ALL IS OFF");
        // when torch is in the off state it returns off as it should
        torchState = FALSE;
        [device setTorchMode:AVCaptureTorchModeOff];
        [device setFlashMode:AVCaptureFlashModeOff];
    }
    [device unlockForConfiguration];
}

-(void) applicationDidEnterForeground:(UIApplication*)application {
    [self toggleTorch];
}

Единственное, что я не включил в код - это касание, которое вызывает toggleTorch для включения / выключения. Эта часть отлично работает, и снова, что я тестирую здесь, это включение при запуске, называемом DidEnterForeground, а также при возврате приложения из многозадачного сеанса.

1 Ответ

0 голосов
/ 08 мая 2012

Я бы изменил 2 вещи: 1. добавьте его в ApplicationDidBecomeActive 2. не используйте тумблер, а установите желаемое состояние (чтобы вы не выключали его дважды или дважды ...).Поэтому измените функцию на toggleTorchWithState ...

Это то, что я сделал в одном из моих приложений, и это прекрасно работает.

...