2012-06-04 14 views
5

Mam okno podglądu kamery, które działa dobrze w 90% przypadków. Czasami jednak, po powrocie do mojej aplikacji, jeśli była ona w tle, podgląd nie zostanie wyświetlony. Jest to kod zadzwonię, gdy widok ładunki:AVCaptureSession nie powiodło się po powrocie z tła

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

Jeśli tak się stanie, mogę przejść do mojego widoku preferencji iz powrotem i wsp jest dobrze, ale jest to irytujące bug Chciałbym zabić. Okno podglądu to UIView w moim scenorysie.

Odpowiedz

7

Nie uruchamiaj sesji przechwytywania przy załadowaniu widoku, zamiast tego uruchom go na viewWillAppear i zatrzymaj na widoku ViewWillDissapear.

Wygląda na to, że kontroler widoku wyczyści trochę pamięci, gdy aplikacja jest w tle. Upewnij się, że inicjujesz sesję przechwytywania, mając to na uwadze.

Przydzielanie sesji leniwie w metodzie gettera prywatnego, a nie w metodzie początkowej, pozwoli uniknąć wycieków pamięci w ten sposób.

+1

Dziękuję, zrobię to i przetestuję to przez kilka godzin :) – mrEmpty

+0

fantastyczne rozwiązanie ....... –

+2

Czekaj - nie jest tak, że 'viewWillAppear' /' Disappear' są tylko wywoływane jak scena porusza się w Twojej aplikacji: nie są one wywoływane, gdy aplikacja wchodzi i wychodzi z pierwszego planu? Czy nie byłoby konieczne zarejestrowanie się w 'UIApplicationWillResignActiveNotification' i użycie tego? [QA z tego przykładem] (http://stackoverflow.com/a/22868754/294884) – Fattie

Powiązane problemy