didFinishPickingMediaWithInfo retornar foto nulo

Eu estou trabalhando para capturar uma imagem que é retornada em 4.0 usando

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

O que está acontecendo é que o dictionary de informações sempre retorna com uma única input:

{UIImagePickerControllerMediaType = “public.image”;

o que é ótimo, mas nunca há uma imagem.

Eu estava usando um ótimo exemplo deste fórum para fazer isso, e tenho certeza que as chamadas estão corretas, mas nunca uma imagem.

Desde já, obrigado!

    Eu sei que isso é muitos meses depois, mas eu lutei com isso por horas, e encontrei esta mesma pergunta em todo este site e iphonedevsdk.com, mas nunca com uma resposta de trabalho.

    Para resumir, se a imagem foi escolhida a partir da biblioteca de rolo / foto da câmera funcionou bem, mas se a imagem foi uma nova foto tirar com a câmera nunca funcionou. Bem, aqui está como fazer funcionar para ambos:

    Você tem que dispensar e liberar o UIImagePickerController antes de tentar fazer qualquer coisa com o dictionary de informações. Para ser super claro:

    Isso não funciona:

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

    Em todos esses casos, a imagem será nula.

    No entanto, através da magia de liberar o UIImagePickerController primeiro …

    Isso funciona:

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

    Louco simples, mas é tudo o que existe para isso.

    enquanto a resposta de Matthew Frederick é mais popular e tem sido a resposta adequada, a partir do iOS 5.0, a Apple disponibilizou dismissViewControllerAnimated:completion: para replace o agora descontinuado (a partir do iOS 6.0 ) dismissViewControllerAnimated:

    executar a recuperação do dictionary de informações da imagem no bloco de conclusão deve fazer mais sentido para todos.

    para pegar o exemplo dele de cima, agora se pareceria com:

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

    Eu tentei tudo acima, mas sem sorte no simulador do iPad 6.0 / 6.1, no entanto eu descobri que a informação contém a chave “UIImagePickerControllerReferenceURL” e aqui está o meu código:

     - (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 o código para 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]); }]; } 

    Há também um bug conhecido com algumas versões do XCode e do Mountain Lion. Verifique seu console para esta mensagem:

    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.

    Provavelmente não funcionará se essa mensagem aparecer. Verifique seu aplicativo no dispositivo iOS real.

    No entanto, reiniciar o simulador e o XCode parece corrigir o problema.

    usar

     [[UIImagePickerController alloc] init]; 

    ao invés de

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

    Eu tive os mesmos sintomas, mas no meu caso, descobri que eu tinha uma categoria em algo na hierarquia UIImagePickerController que substituiu “uuid” ou “setUUID”? Eu acho que o CoreData precisa desses methods ou fica muito, muito confuso, e a biblioteca de ativos é toda a coisa do 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; } 

    Os seguintes passos devem ser seguidos:
    1) Faça a UIActionSheet
    2) Na seleção do tipo de fonte necessária – carga resrouces
    3) didFinishPickingMediaWithInfo – definir imagem da imagem Dicionário recebido

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