Enciende la linterna / flash en iPhone

Sé que la única manera de encender el flash y mantenerlo encendido en el iPhone 4 es encender la cámara de video. Aunque no estoy muy seguro del código. Esto es lo que estoy intentando:

-(IBAction)turnTorchOn { AVCaptureSession *captureSession = [[AVCaptureSession alloc] init]; AVCaptureDevice *videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error = nil; AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoCaptureDevice error:&error]; if (videoInput) { [captureSession addInput:videoInput]; AVCaptureVideoDataOutput* videoOutput = [[AVCaptureVideoDataOutput alloc] init]; [videoOutput setSampleBufferDelegate:self queue:dispatch_get_current_queue()]; [captureSession addOutput:videoOutput]; [captureSession startRunning]; videoCaptureDevice.torchMode = AVCaptureTorchModeOn; } } 

¿Alguien sabe si esto funcionaría o me falta algo? (Todavía no tengo un iPhone 4 para probar, solo estoy probando algunas de las nuevas API).

Gracias

lockforConfiguration está establecido en su código, donde declara que su AVCaptureDevice es una propiedad.

 [videoCaptureDevice lockForConfiguration:nil]; 

Aquí hay una versión más corta que ahora puede usar para encender o apagar la luz:

 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch]) { [device lockForConfiguration:nil]; [device setTorchMode:AVCaptureTorchModeOn]; // use AVCaptureTorchModeOff to turn off [device unlockForConfiguration]; } 

ACTUALIZACIÓN: (marzo de 2015)

Con iOS 6.0 y posterior, puedes controlar el brillo o el nivel de la linterna usando el siguiente método:

 - (void)setTorchToLevel:(float)torchLevel { AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch]) { [device lockForConfiguration:nil]; if (torchLevel <= 0.0) { [device setTorchMode:AVCaptureTorchModeOff]; } else { if (torchLevel >= 1.0) torchLevel = AVCaptureMaxAvailableTorchLevel; BOOL success = [device setTorchModeOnWithLevel:torchLevel error:nil]; } [device unlockForConfiguration]; } } 

También es posible que desee controlar el valor de retorno ( success ) de setTorchModeOnWithLevel: Puede obtener una falla si intenta configurar el nivel demasiado alto y la antorcha se sobrecalienta. En ese caso, establecer el nivel en AVCaptureMaxAvailableTorchLevel establecerá el nivel al nivel más alto permitido dada la temperatura de la antorcha.

La respuesta de iWasRobbed es genial, excepto que hay una sesión AVCaptureSession ejecutándose en segundo plano todo el tiempo. En mi iPhone 4s toma aproximadamente 12% de potencia de la CPU según el Instrumento, por lo que mi aplicación tomó aproximadamente 1% de batería en un minuto. En otras palabras, si el dispositivo está preparado para la captura AV, no es barato.

Usar el código debajo de mi aplicación requiere 0.187% por minuto, por lo que la duración de la batería es más de 5 veces más larga.

Este código funciona bien en cualquier dispositivo (probado en 3GS (sin flash) y 4s). Probado en 4.3 en el simulador también.

 #import  - (void) turnTorchOn:(BOOL)on { 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; } else { [device setTorchMode:AVCaptureTorchModeOff]; [device setFlashMode:AVCaptureFlashModeOff]; torchIsOn = NO; } [device unlockForConfiguration]; } } } 

Vea una mejor respuesta a continuación: https://stackoverflow.com/a/10054088/308315


Respuesta anterior:

Primero, en su archivo .h de AppDelegate:

 #import  @interface AppDelegate : NSObject  { AVCaptureSession *torchSession; } @property (nonatomic, retain) AVCaptureSession * torchSession; @end 

Luego, en su archivo AppDelegate .m:

 @implementation AppDelegate @synthesize torchSession; - (void)dealloc { [torchSession release]; [super dealloc]; } - (id) init { 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; } 

Luego, cada vez que quiera encenderlo, solo haga algo como esto:

 // 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]; [device lockForConfiguration:nil]; [device setTorchMode:AVCaptureTorchModeOn]; [device setFlashMode:AVCaptureFlashModeOn]; [device unlockForConfiguration]; } 

Y similar para apagarlo:

 // 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]; [device lockForConfiguration:nil]; [device setTorchMode:AVCaptureTorchModeOff]; [device setFlashMode:AVCaptureFlashModeOff]; [device unlockForConfiguration]; } 

He escrito un complemento de Torch que funciona para Cordova 2.2.0. Lo puedes encontrar aquí:

https://github.com/tomschreck/iOS-Torch-Plugin

Desde iOS 6.0 y superior, activar / desactivar el flash de la antorcha,

 - (void) toggleFlash { AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch] && [device hasFlash]){ [device lockForConfiguration:nil]; [device setFlashMode:(device.flashActive) ? AVCaptureFlashModeOff : AVCaptureFlashModeOn]; [device setTorchMode:(device.torchActive) ? AVCaptureTorchModeOff : AVCaptureTorchModeOn]; [device unlockForConfiguration]; } } 

PD: este enfoque solo es sugestionable si no tiene la función de encendido / apagado. Recuerde que hay una opción más Auto . es decir, AVCaptureFlashModeAuto y AVCaptureTorchModeAuto . Para admitir también el modo automático, debe hacer un seguimiento del modo actual y en función de ese modo de cambio de flash y linterna.

Versión de Swift 2.0:

 func setTorchLevel(torchLevel: Float) { self.captureSession?.beginConfiguration() defer { self.captureSession?.commitConfiguration() } if let device = backCamera?.device where device.hasTorch && device.torchAvailable { do { try device.lockForConfiguration() defer { device.unlockForConfiguration() } if torchLevel <= 0.0 { device.torchMode = .Off } else if torchLevel >= 1.0 { try device.setTorchModeOnWithLevel(min(torchLevel, AVCaptureMaxAvailableTorchLevel)) } } catch let error { print("Failed to set up torch level with error \(error)") return } } } 
 //import fremework in .h file #import  { AVCaptureSession *torchSession; } @property(nonatomic,retain)AVCaptureSession *torchSession; -(IBAction)onoff:(id)sender; //implement in .m file @synthesize torchSession; -(IBAction)onoff:(id)sender { AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch] && [device hasFlash]) { if (device.torchMode == AVCaptureTorchModeOff) { [button setTitle:@"OFF" forState:UIControlStateNormal]; 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 setTorchSession:session]; [session release]; } else { [button setTitle:@"ON" forState:UIControlStateNormal]; [torchSession stopRunning]; } } } - (void)dealloc { [torchSession release]; [super dealloc]; } 

Este trabajo está muy bien … ¡espero que ayude a alguien!

 -(IBAction)flashlight:(id)sender { AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch] && [device hasFlash]){ if (device.torchMode == AVCaptureTorchModeOff) { [sender setTitle:@"Torch Off" forState:UIControlStateNormal]; AVCaptureDeviceInput *flashInput = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil]; AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init]; AVCaptureSession *cam = [[AVCaptureSession alloc] init]; [cam beginConfiguration]; [device lockForConfiguration:nil]; [device setTorchMode:AVCaptureTorchModeOn]; [device setFlashMode:AVCaptureFlashModeOn]; [cam addInput:flashInput]; [cam addOutput:output]; [device unlockForConfiguration]; [cam commitConfiguration]; [cam startRunning]; [self setTorchSession:cam]; } else { [sender setTitle:@"Torch On" forState:UIControlStateNormal]; [_torchSession stopRunning]; } } } 
    Intereting Posts