Tomar una foto a través de la cámara provocando que la aplicación se bloquee

Im developing a photo application app.Users have and option for choosing the pictures from camera and photolibray.

Photo library is working well.

But when i tried to take photo from camera it get crashed.

After crashing it is showing the message in console "Received memory warning. Level=1

Received memory warning. Level=2".

I used the below code below(open source) for taking pictures through camera:

  #import "OverlayViewController.h"

enum
{
    kOneShot,       // user wants to take a delayed single shot
    kRepeatingShot  // user wants to take repeating shots
};

@implementation OverlayViewController

@synthesize delegate, takePictureButton, startStopButton,
            cancelButton, timedButton,
            tickTimer, cameraTimer,
            imagePickerController;


#pragma mark -
#pragma mark OverlayViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]))
    {
        AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:
                                                    [[NSBundle mainBundle] pathForResource:@"tick"
                                                                                    ofType:@"aiff"]],
                                         &tickSound);

        self.imagePickerController = [[[UIImagePickerController alloc] init] autorelease];
        self.imagePickerController.delegate = self;
    }
    return self;
}

- (void)viewDidUnload
{
    self.takePictureButton = nil;
    self.startStopButton = nil;
    self.timedButton = nil;
    self.cancelButton = nil;

    self.cameraTimer = nil;

    [super viewDidUnload];
}

- (void)dealloc
{   
    [takePictureButton release];
    [startStopButton release];
    [cancelButton release];
    [timedButton release];

    [imagePickerController release];
    AudioServicesDisposeSystemSoundID(tickSound);

    [cameraTimer release];
    [tickTimer release];

    [super dealloc];
}

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType
{
    self.imagePickerController.sourceType = sourceType;

    if (sourceType == UIImagePickerControllerSourceTypeCamera)
    {
        // user wants to use the camera interface
        //
        self.imagePickerController.showsCameraControls = NO;

        if ([[self.imagePickerController.cameraOverlayView subviews] count] == 0)
        {

            CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame;
            CGRect newFrame = CGRectMake(0.0,
                                         CGRectGetHeight(overlayViewFrame) -
                                         self.view.frame.size.height - 10.0,
                                         CGRectGetWidth(overlayViewFrame),
                                         self.view.frame.size.height + 10.0);
            self.view.frame = newFrame;
            [self.imagePickerController.cameraOverlayView addSubview:self.view];
        }
    }
}

// called when the parent application receives a memory warning
- (void)didReceiveMemoryWarning
{
    // we have been warned that memory is getting low, stop all timers
    //
    [super didReceiveMemoryWarning];

    // stop all timers
    [self.cameraTimer invalidate];
    cameraTimer = nil;

    [self.tickTimer invalidate];
    tickTimer = nil;
}

// update the UI after an image has been chosen or picture taken
//
- (void)finishAndUpdate
{
    [self.delegate didFinishWithCamera];  // tell our delegate we are done with the camera

    // restore the state of our overlay toolbar buttons
    self.cancelButton.enabled = YES;
    self.takePictureButton.enabled = YES;
    self.timedButton.enabled = YES;
    self.startStopButton.enabled = YES;
    self.startStopButton.title = @"Start";
}


#pragma mark -
#pragma mark Camera Actions

- (IBAction)done:(id)sender
{
    // dismiss the camera
    //
    // but not if it's still taking timed pictures
    if (![self.cameraTimer isValid])
        [self finishAndUpdate];
}

// this will take a timed photo, to be taken 5 seconds from now
//
//- (IBAction)timedTakePhoto:(id)sender
//{
//    // these controls can't be used until the photo has been taken
//    self.cancelButton.enabled = NO;
//    self.takePictureButton.enabled = NO;
//    self.timedButton.enabled = NO;
//    self.startStopButton.enabled = NO;
//
//    if (cameraTimer != nil)
//        [cameraTimer invalidate];
//    cameraTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
//                                                   target:self
//                                                 selector:@selector(timedPhotoFire:)
//                                                 userInfo:[NSNumber numberWithInt:kOneShot]
//                                                  repeats:YES];
//
//    // start the timer to sound off a tick every 1 second (sound effect before a timed picture is taken)
//    if (tickTimer != nil)
//        [tickTimer invalidate];
//    tickTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
//                                                   target:self
//                                                 selector:@selector(tickFire:)
//                                                 userInfo:nil
//                                                  repeats:YES];
//}

- (IBAction)takePhoto:(id)sender
{
    [self.imagePickerController takePicture];
}

- (IBAction)startStop:(id)sender
{
    if ([self.cameraTimer isValid])
    {
        // stop and reset the timer
        [self.cameraTimer invalidate];
        cameraTimer = nil;

        [self finishAndUpdate];
    }
    else
    {

        self.startStopButton.title = @"Stop";
        self.cancelButton.enabled = NO;
        self.timedButton.enabled = NO;
        self.takePictureButton.enabled = NO;

        cameraTimer = [NSTimer scheduledTimerWithTimeInterval:1.5   // fire every 1.5 seconds
                                                       target:self
                                                     selector:@selector(timedPhotoFire:)
                                                     userInfo:[NSNumber numberWithInt:kRepeatingShot]
                                                      repeats:YES];
        [cameraTimer fire]; // start taking pictures right away
    }
}


#pragma mark -
#pragma mark Timer

// gets called by our repettive timer to take a picture
- (void)timedPhotoFire:(NSTimer *)timer
{
    [self.imagePickerController takePicture];

    NSInteger cameraAction = [self.cameraTimer.userInfo integerValue];
    switch (cameraAction)
    {
        case kOneShot:
        {
            // timer fired for a delayed single shot
            [self.cameraTimer invalidate];
            cameraTimer = nil;

            [self.tickTimer invalidate];
            tickTimer = nil;

            break;
        }

        case kRepeatingShot:
        {
            // timer fired for a repeating shot
            break;
        }
    }
}

// gets called by our delayed camera shot timer to play a tick noise
- (void)tickFire:(NSTimer *)timer
{
    AudioServicesPlaySystemSound(tickSound);
}


#pragma mark -
#pragma mark UIImagePickerControllerDelegate

// this get called when an image has been chosen from the library or taken from the camera
//
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];

    // give the taken picture to our delegate
    if (self.delegate)
        [self.delegate didTakePicture:image];

    if (![self.cameraTimer isValid])
        [self finishAndUpdate];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [self.delegate didFinishWithCamera];    // tell our delegate we are finished with the picker
}

@end

Can anyone please help me how to resolve this issue.Thanks in advance.

preguntado el 08 de noviembre de 11 a las 12:11

1 Respuestas

It is because of memory Issue. try this -

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc]init];
    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];

    // give the taken picture to our delegate
    if (self.delegate)
        [self.delegate didTakePicture:image];

    if (![self.cameraTimer isValid])
        [self finishAndUpdate];
    [thePool release];
}

Image captured from camaera has size of around 8 MB. So If you capture multiple Image at a time and all images is in the memory then memory issue will start comming. you can resize Image and then can convert image into JPEG format to decrease the size.

Resize Image -

+ (UIImage*)imageWithImage:(UIImage*)image 
               scaledToSize:(CGSize)newSize;
{
   UIGraphicsBeginImageContext( newSize );
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return newImage;
}

respondido 08 nov., 11:16

Thankyou.I added your code but still it is crashing.These messages are showing in console. Received memory warning. Level=1Received memory warning.Level=2 warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.2 (8H7)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found). - ishhhh

when you capture the Image you closing the camera or you capturing multiple Images in same session. - iOSPawan

whole problem is - UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage]; this object size should be around 8 MB and it is autorelase. If more then three object the - iOSPawan

@pawan.mangal.how can i check whether the captured image is greater than 8MB.Also when i deleted all the images from phone it is working fine.So as you told by the checking the condition it may fix the problem.Can you help me please.. - ishhhh

When u get image from UIImagePickerController . resize the Image to size - 320*480 and then pass resized image to your delegate. hope this should solve the issue. - iOSPawan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.