1

アプリを終了して「オン」状態に戻ると、トーチ/フラッシュをオンにすることで正常に動作することがありますが、ほとんどの場合、フラッシュするかオフのままになります。

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)と、アプリがマルチタスクセッションから戻ったときにオンにすることです。

4

1 に答える 1

0

私は2つのことを変更します:1。それをApplicationDidBecomeActiveに追加します2.トグルトーチを使用せずに、希望する状態を設定します(したがって、2回オフまたは2回オンにしないでください...)。したがって、関数をtoggleTorchWithStateに変更します...

私が自分のアプリの1つで行ったこと、そしてそれは完璧に機能します。

于 2012-05-08T17:33:15.490 に答える