didFinishPickingMediaWithInfo return nil photo

Sto lavorando per catturare un’immagine che viene restituita in 4.0 utilizzando

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

Quello che sta succedendo è che il dizionario delle informazioni ritorna sempre con una singola voce:

{UIImagePickerControllerMediaType = “public.image”;

che è fantastico, ma non c’è mai un’immagine.

Stavo usando un ottimo esempio da questo forum per fare questo, e sono abbastanza sicuro che le chiamate siano corrette, ma mai un’immagine.

Grazie in anticipo!

So che sono passati molti mesi, ma ho lottato con questo per ore, e ho trovato questa stessa domanda in tutto questo sito e iphonedevsdk.com, ma mai con una risposta funzionante.

Per riassumere, se l’immagine è stata scelta dal rullino fotografico / libreria fotografica ha funzionato bene, ma se l’immagine è stata una nuova foto, prendere con la fotocamera non ha mai funzionato. Bene, ecco come farlo funzionare per entrambi:

Devi chiudere e rilasciare UIImagePickerController prima di provare a fare qualcosa con il dizionario delle informazioni. Per essere super-chiaro:

Questo non funziona:

 - (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 tutti questi casi l’immagine sarà nulla.

Tuttavia, tramite la magia di rilasciare UIImagePickerController prima …

Questo funziona:

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

Pazzo semplice, ma questo è tutto quello che c’è da fare.

mentre la risposta di Matthew Frederick è più popolare ed è stata a lungo la risposta appropriata, a partire da iOS 5.0, apple reso disponibile dismissViewControllerAnimated:completion: per sostituire l’ormai deprecato (come da iOS 6.0) dismissViewControllerAnimated:

si spera che il recupero del dizionario delle informazioni sull’immagine nel blocco di completamento abbia più senso per tutti.

per prendere il suo esempio da sopra, ora sembrerebbe:

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

Ho provato tutto quanto sopra, ma non ho fortuna con il simulatore di iPad 6.0 / 6.1, tuttavia ho trovato che le informazioni contengono la chiave “UIImagePickerControllerReferenceURL” e qui c’è il mio codice:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissViewControllerAnimated:YES completion:NULL]; UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage]; if(NULL == image){ [MyImageLoader loadImageFromAssertByUrl:[info objectForKey:@"UIImagePickerControllerReferenceURL"] completion:^(UIImage* img){ //img not null here }]; }else{ //image not null here } } 

e il codice per loadImageFromAssertByUrl è:

 +(void) loadImageFromAssertByUrl:(NSURL *)url completion:(void (^)(UIImage*)) completion{ ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init]; [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) { ALAssetRepresentation *rep = [asset defaultRepresentation]; Byte *buffer = (Byte*)malloc(rep.size); NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil]; NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; UIImage* img = [UIImage imageWithData:data]; completion(img); } failureBlock:^(NSError *err) { NSLog(@"Error: %@",[err localizedDescription]); }]; } 

C’è anche un bug noto con alcune versioni di XCode e Mountain Lion. Controlla la tua console per questo messaggio:

2013-01-17 21:36:34.946 3sure-ios[5341:1803] Named service 'com.apple.PersistentURLTranslator.Gatekeeper' not found. assetsd is down or misconfigured. Things will not work the way you expect them to.

Probabilmente non funzionerà se viene visualizzato quel messaggio. Controlla la tua app sul dispositivo iOS reale.

Tuttavia, riavviare sia il simulatore che XCode sembra risolvere il problema.

uso

 [[UIImagePickerController alloc] init]; 

invece di

 [[UIImagePickerController alloc] initWithNibName:(NSString *) bundle:(NSBundle *)]; 

Ho avuto gli stessi sintomi, ma nel mio caso si è scoperto che avevo una categoria su qualcosa nella gerarchia UIImagePickerController che sovrascriveva “uuid” o “setUUID”? Immagino che CoreData abbia bisogno di questi metodi o diventa molto, molto confuso, e la libreria di risorse è tutta roba CoreData.

 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissViewControllerAnimated:YES completion:NULL]; //Image picker for nil value UIImage* selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage]; NSLog(@"my Info :: %@", info); if(NULL == selectedImage){ UIImage * selectedImage = [PhotoViewController loadImageFromAssertByUrl:[info objectForKey:@"UIImagePickerControllerReferenceURL"] completion:^(UIImage * selectedImage){ //img not null here NSLog(@"img2 ::: %@", selectedImage); uploadImg.image = selectedImage; [self.view addSubview:PermissionView]; }]; }else{ //image not null here NSLog(@"Up IMG00 :: %@", uploadImg.image); NSLog(@"Sel IMG00 :: %@", selectedImage); uploadImg.image = [selectedImage retain]; NSLog(@"Up IMG22 :: %@", uploadImg.image); NSLog(@"Sel IMG22 :: %@", selectedImage); } } +(UIImage *) loadImageFromAssertByUrl:(NSURL *)url completion:(void (^)(UIImage*)) completion{ __block UIImage* img; ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init]; [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) { ALAssetRepresentation *rep = [asset defaultRepresentation]; Byte *buffer = (Byte*)malloc(rep.size); NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil]; NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; img = [UIImage imageWithData:data]; completion(img); NSLog(@"img ::: %@", img); } failureBlock:^(NSError *err) { NSLog(@"Error: %@",[err localizedDescription]); }]; return img; } 

I seguenti passaggi devono essere seguiti:
1) Crea UIActionSheet
2) Sulla selezione del tipo di fonte necessario – il carico viene avviato
3) didFinishPickingMediaWithInfo – imposta l’immagine dall’immagine Dizionario ricevuto

  - (IBAction)actionButtonUpload:(id)sender { UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera",@"Photo Library", nil]; [actionSheet showInView:self.view]; } #pragma mark -- UIActionSheet Delegate -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; UIAlertView *alert; switch (buttonIndex) { case 0: if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { NSLog(@"No camera!"); picker.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentViewController:picker animated:YES completion:NULL]; } else { alert = [[UIAlertView alloc]initWithTitle:@"Alumnikonnect" message:@"Camera is not available, please select a different media" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; } break; case 1: if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:picker animated:YES completion:NULL]; } else { alert = [[UIAlertView alloc]initWithTitle:@"Alumnikonnect" message:@"Photolibrary is not available, please select a different media" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; } break; } } #pragma mark - Image picker delegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { self.imageEventPic.layer.cornerRadius = self.imageEventPic.frame.size.height /2; self.imageEventPic.layer.masksToBounds = YES; self.imageEventPic.layer.borderWidth = 0; self.imageEventPic.layer.borderWidth = 1.0f; self.imageEventPic.layer.borderColor = [UIColor colorWithRed:0.212 green:0.255 blue:0.302 alpha:1.000].CGColor; self.labelUploadPic.hidden = YES; self.imageEventPic.image = info[UIImagePickerControllerOriginalImage]; [self dismissViewControllerAnimated:YES completion:NULL]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [self dismissViewControllerAnimated:YES completion:NULL]; } -(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize; { UIGraphicsBeginImageContext( newSize ); [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; }