36

How can I turn the iPhone's LED camera flash on/off programatically?

Shahid Aslam
  • 2,585
  • 3
  • 24
  • 31

2 Answers2

82
#import <AVFoundation/AVFoundation.h>

...

- (void) turnTorchOn: (bool) on {

    // check if flashlight available
    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
    if (captureDeviceClass != nil) {
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        if ([device hasTorch] && [device hasFlash]){

            [device lockForConfiguration:nil];
            if (on) {
                [device setTorchMode:AVCaptureTorchModeOn];
                [device setFlashMode:AVCaptureFlashModeOn];
                //torchIsOn = YES; //define as a variable/property if you need to know status 
            } else {
                [device setTorchMode:AVCaptureTorchModeOff];
                [device setFlashMode:AVCaptureFlashModeOff];
                //torchIsOn = NO;            
            }
            [device unlockForConfiguration];
        }
    } }
Tibidabo
  • 21,461
  • 5
  • 90
  • 86
  • Where do you declare `torchIsOn` ? –  Feb 03 '13 at 17:44
  • @YassineHoussni you can define it either as an iVar in the class name or a property if you need getter and setters – Dejell Feb 06 '13 at 12:50
  • @Odelya yeah I already found the solution, I have defined it as a property, thanks though! –  Feb 06 '13 at 12:53
  • You could replace the iVar with `device.torchActive`. – Mick MacCallum Mar 02 '13 at 19:41
  • 1
    I better way to check for a class is: if ([AVCaptureDevice class]) { ... } // if you can the SDK that has a class but you're not sure the class exists on the device. – Leslie Godwin Jul 05 '13 at 06:51
  • for me this just turns the flashlight on my phone on, it doesn't just turn the flash on at the moment a photo is taken in my AVCaptureSession. – jjjjjjjj Mar 18 '16 at 16:50
  • I' using these solution for my C++ call and it works pretty fine! Thanks! – peter70 Feb 26 '19 at 14:58
25

I combined the timer with the above code.it worked for me...

 - (void)viewDidLoad
        {
         [super viewDidLoad];

         myTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self                    selector:@selector(toggleFlashlight) userInfo:nil repeats:YES];
        // Do any additional setup after loading the view from its nib.
        }
       - (void) toggleFlashlight
       {

    // check if flashlight available
    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
    if (captureDeviceClass != nil) {
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        if ([device hasTorch] && [device hasFlash]){

            [device lockForConfiguration:nil];
            if (device.torchMode == AVCaptureTorchModeOff) 
            {
                [device setTorchMode:AVCaptureTorchModeOn];
                [device setFlashMode:AVCaptureFlashModeOn];
                //torchIsOn = YES;
            }
            else 
            {
                [device setTorchMode:AVCaptureTorchModeOff];
                [device setFlashMode:AVCaptureFlashModeOff];
               // torchIsOn = NO;            
            }
            [device unlockForConfiguration];
        }
    } }
Sanjay Chaudhry
  • 3,181
  • 1
  • 22
  • 31
girish
  • 900
  • 12
  • 23