2012-06-04 30 views
5

Tengo una ventana de vista previa de la cámara que funciona bien el 90% del tiempo. A veces, sin embargo, al volver a mi aplicación si ha estado en segundo plano, la vista previa no se mostrará. Este es el código que llamo cuando la vista cargas:AVCaptureSession falla al volver desde el fondo

- (void) startCamera { 

session = [[AVCaptureSession alloc] init]; 
session.sessionPreset = AVCaptureSessionPresetPhoto; 

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
captureVideoPreviewLayer.frame = _cameraView.bounds; 
[_cameraView.layer addSublayer:captureVideoPreviewLayer]; 
captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
captureVideoPreviewLayer.position=CGPointMake(CGRectGetMidX(_cameraView.bounds), 160); 

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
NSError *error = nil; 

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 
if (!input) { 

    NSLog(@"ERROR: %@", error); 


    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Important!" 
                message:@"Unable to find a camera." 
                delegate:nil 
              cancelButtonTitle:@"Ok" 
              otherButtonTitles:nil]; 
    [alert show]; 
    [alert autorelease]; 
} 

[session addInput:input]; 

stillImage = [[AVCaptureStillImageOutput alloc] init]; 
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG , AVVideoCodecKey, nil]; 
[stillImage setOutputSettings:outputSettings]; 

[session addOutput:stillImage]; 
[session startRunning]; 
} 

Si esto sucede, puedo cambiar a mi modo de ver las preferencias y de vuelta otra vez y Al es bueno, pero es un molesto error que me gustaría matar. La ventana de vista previa es una UIView en mi guión gráfico.

Respuesta

7

No inicie la sesión de captura en la carga de vista, en su lugar, iníciela en viewWillAppear y deténgalo en viewWillDissapear.

Parece que su controlador de vista está limpiando algo de memoria cuando la aplicación está en segundo plano. Asegúrese de inicializar su sesión de captura con esto en mente.

Asigne su sesión perezosamente en un método getter de propiedad privada en lugar de en su método de inicio, evitará fugas de memoria de esta manera.

+1

Gracias, lo haré y lo probaré por unas horas :) – mrEmpty

+0

solución fantástica ....... –

+2

Espera - ¿no es cierto que 'viewWillAppear' /' Disappear' solo se llama a medida que la escena se mueve en tu aplicación: ¿no se les llama cuando la aplicación entra y sale del primer plano? ¿No sería necesario registrarse para 'UIApplicationWillResignActiveNotification' y usar eso? [QA con un ejemplo de eso] (http://stackoverflow.com/a/22868754/294884) – Fattie

Cuestiones relacionadas