Toma una foto en tu iPhone sin mostrar controles

¿Hay alguna forma de tomar una foto en código en el iPhone sin pasar por los controles de Apple? He visto muchas aplicaciones que hacen esto, pero no estoy seguro de qué llamadas de API usar.

Sí, hay dos formas de hacer esto. Uno, disponible en iOS 3.0+, es usar la clase UIImagePickerController , establecer la propiedad showsCameraControls en NO y establecer la propiedad cameraOverlayView en sus propios controles personalizados. Dos, disponible en iOS 4.0+, es configurar una AVCaptureSession , proporcionándole una AVCaptureDeviceInput usando el dispositivo de cámara apropiado y AVCaptureStillImageOutput . El primer enfoque es mucho más simple, y funciona en más versiones de iOS, pero el segundo enfoque le da un control mucho mayor sobre la resolución de fotos y las opciones de archivos.

EDITAR: Como se sugiere en los comentarios a continuación, ahora he mostrado explícitamente cómo debe declararse e inicializarse la sesión AVCaptureSession. Parece que algunos estaban haciendo la inicialización incorrecta o declarando AVCaptureSession como una variable local en un método. Esto no funcionaria

El siguiente código permite tomar una imagen usando AVCaptureSession sin la intervención del usuario:

 // Get all cameras in the application and find the frontal camera. AVCaptureDevice *frontalCamera; NSArray *allCameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; // Find the frontal camera. for ( int i = 0; i < allCameras.count; i++ ) { AVCaptureDevice *camera = [allCameras objectAtIndex:i]; if ( camera.position == AVCaptureDevicePositionFront ) { frontalCamera = camera; } } // If we did not find the camera then do not take picture. if ( frontalCamera != nil ) { // Start the process of getting a picture. session = [[AVCaptureSession alloc] init]; // Setup instance of input with frontal camera and add to session. NSError *error; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:frontalCamera error:&error]; if ( !error && [session canAddInput:input] ) { // Add frontal camera to this session. [session addInput:input]; // We need to capture still image. AVCaptureStillImageOutput *output = [[AVCaptureStillImageOutput alloc] init]; // Captured image. settings. [output setOutputSettings: [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]]; if ( [session canAddOutput:output] ) { [session addOutput:output]; AVCaptureConnection *videoConnection = nil; for (AVCaptureConnection *connection in output.connections) { for (AVCaptureInputPort *port in [connection inputPorts]) { if ([[port mediaType] isEqual:AVMediaTypeVideo] ) { videoConnection = connection; break; } } if (videoConnection) { break; } } // Finally take the picture if ( videoConnection ) { [session startRunning]; [output captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { if (imageDataSampleBuffer != NULL) { NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; UIImage *photo = [[UIImage alloc] initWithData:imageData]; } }]; } } } } 

La variable de sesión es del tipo AVCaptureSession y se ha declarado en el archivo .h de la clase (ya sea como una propiedad o como un miembro privado de la clase):

 AVCaptureSession *session; 

Entonces deberá inicializarse en algún lugar, por ejemplo, en el método init de la clase:

 session = [[AVCaptureSession alloc] init]