quitar que prende prenda porque parpadeo notificaciones notificacion luz llaman hacer funciona cuando como activar ios iphone avcapturesession avcapturedevice

ios - que - led notificaciones iphone 7



Enciende la linterna/flash en iPhone (9)

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


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.


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.


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]; } } }



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 <AVFoundation/AVFoundation.h> - (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]; } } }


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 } } }


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

[videoCaptureDevice lockForConfiguration:nil];


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

Respuesta anterior:

Primero, en su archivo .h de AppDelegate:

#import <AVFoundation/AVFoundation.h> @interface AppDelegate : NSObject <UIApplicationDelegate> { 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]; }


//import fremework in .h file #import <AVFoundation/AVFoundation.h> { 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]; }