Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

didFinishPickingMediaWithInfo return nil photo

I am working to capture an image that is returned in 4.0 using

- (void)imagePickerController:(UIImagePickerController *)picker      didFinishPickingMediaWithInfo:(NSDictionary *)info {     [[picker parentViewController] dismissModalViewControllerAnimated:YES];       // MediaType can be kUTTypeImage or kUTTypeMovie. If it's a movie then you     // can get the URL to the actual file itself. This example only looks for images.     //        NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];     // NSString* videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];      // Try getting the edited image first. If it doesn't exist then you get the     // original image.     //     if (CFStringCompare((CFStringRef) mediaType,  kUTTypeImage, 0) == kCFCompareEqualTo) {                        UIImage* picture = [info objectForKey:UIImagePickerControllerEditedImage];         if (!picture)             picture = [info objectForKey:UIImagePickerControllerOriginalImage];                       // **picture is always nil             // info dictionary count = 1       }  } 

What is happening is that the info dictionary always returns with a single entry:

{ UIImagePickerControllerMediaType = "public.image";

which is great, but there is never an image.

I was using a great example from this forum to do this, and I am pretty sure the calls are correct, but never an image.

Thanks in advance!

like image 641
Rob Bonner Avatar asked Jun 21 '10 22:06

Rob Bonner


2 Answers

I know this is many months later, but I struggled with this for hours, and found this same question all over this site and iphonedevsdk.com, but never with a working answer.

To summarize, if the image was picked from the camera roll/photo library it worked fine, but if the image was a new photo take with the camera it never worked. Well, here's how to make it work for both:

You have to dismiss and release the UIImagePickerController before you try to do anything with the info dictionary. To be super-clear:

This DOES NOT work:

- (void)imagePickerController:(UIImagePickerController *)picker                        didFinishPickingMediaWithInfo:(NSDictionary *)info {            // No good with the edited image (if you allowed editing)   myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];           // AND no good with the original image   myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];           // AND no doing some other kind of assignment   UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage];    [picker dismissModalViewControllerAnimated:YES];   [picker release]; } 

In all of those cases the image will be nil.

However, via the magic of releasing the UIImagePickerController first...

This DOES work:

- (void)imagePickerController:(UIImagePickerController *)picker                        didFinishPickingMediaWithInfo:(NSDictionary *)info {    [picker dismissModalViewControllerAnimated:YES];   [picker release];            // Edited image works great (if you allowed editing)   myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];           // AND the original image works great   myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];           // AND do whatever you want with it, (NSDictionary *)info is fine now   UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage]; } 

Crazy simple, but that's all there is to it.

like image 152
Matthew Frederick Avatar answered Sep 22 '22 01:09

Matthew Frederick


whilst Matthew Frederick's answer is most popular and has long been the appropriate response, as of iOS 5.0, apple made available dismissViewControllerAnimated:completion:, to replace the now deprecated (as of iOS 6.0) dismissViewControllerAnimated:.

performing the image info dictionary retrieval in the completion block should hopefully make more sense to all.

to take his example from above, it would now look like:

- (void)    imagePickerController:(UIImagePickerController *)picker      didFinishPickingMediaWithInfo:(NSDictionary *)info  {     [picker dismissViewControllerAnimated:YES completion:^{           // Edited image works great (if you allowed editing)         myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];           // AND the original image works great         myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];           // AND do whatever you want with it, (NSDictionary *)info is fine now         UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage];     }]; } 
like image 24
john.k.doe Avatar answered Sep 23 '22 01:09

john.k.doe