UIImagePickerControllerReferenceURL总是返回nill

我试图从下面的代码中获取我刚刚从相机捕获的图像的名称。 但是[info objectForKey:@"UIImagePickerControllerReferenceURL"]总是返回nil。 我怎样才能得到的url?

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { self.myinfo = info; NSLog(@"Dismissing camera ui..."); [self.cameraUI dismissViewControllerAnimated:YES completion:nil]; NSLog(@"Getting media url..."); NSString *mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; NSLog(@"Media url = %@", mediaURL); NSLog(@"Getting media type..."); NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; NSLog(@"Selected mediaType: %@", mediaType); if(mediaURL) { NSLog(@"This is a video = %@", mediaURL); if (![mediaType isEqualToString:(NSString*)kUTTypeVideo]) { UISaveVideoAtPathToSavedPhotosAlbum(mediaURL, self, @selector(video:didFinishSavingWithError:contextInfo:), NULL); } } else { NSLog(@"This is a photo..."); self.originalImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage]; if (self.source == UIImagePickerControllerSourceTypeCamera && [mediaType isEqualToString:(NSString*)kUTTypeImage]) { // Image captured from camera NSLog(@"Saving new image..."); if (self.source != UIImagePickerControllerSourceTypePhotoLibrary) { UIImageWriteToSavedPhotosAlbum(self.originalImage, self, @selector(image:didFinishSavingWithError:usingContextInfo:), nil); } } // Image selected from previous images. else { NSLog(@"Getting reference url..."); self.referenceURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]; NSLog(@"Reference url = %@", [self.referenceURL absoluteString]); [self saveAssetData:self.originalImage :info]; } } } - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error usingContextInfo:(void*)ctxInfo { if (error) { NSLog(@"Resim kaydedilemedi: %@", [error localizedDescription]); NSString *title = @"Resim kaydedilemedi!"; NSString* message = @"Resim kaydedilirken hata oluştu!"; [self alertStatus:message:title]; } else { NSLog(@"Save asset data..."); [self saveAssetData:image :self.myinfo]; } } - (void)saveAssetData:(UIImage*)originalImage :(NSDictionary*)info { self.assetLibrary = [[ALAssetsLibrary alloc] init]; NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"]; ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) { ALAssetRepresentation *assetRep = [asset defaultRepresentation]; NSString *filename = [assetRep filename]; NSLog(@"File name = %@", filename); if(self.selectedMediaNames == nil) self.selectedMediaNames = [[NSMutableArray alloc] init]; [self.selectedMediaNames addObject:filename]; [self.tableView reloadData]; [self.activitIndicator stopAnimating]; [self.activitIndicator setHidden:true]; HMXSharedDataManager *sharedDataManager = [HMXSharedDataManager sharedManager]; [sharedDataManager.uploaMedias addObject:originalImage]; [sharedDataManager.uploaMediaNames addObject:filename]; }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error) { NSLog(@"%@", error); }; [self.assetLibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock]; } 

更新:

这是一个晚一点,但在这里我如何得到的图像或video的名称:

  • 检查UIImagePickerControllerMediaURL ,如果它是null的媒体是一个图像,如果不是一个video
  • 如果图片或video刚刚拍摄或录制,请将其保存到相册中
  • 使用ALAssetsLibrary来查询文件名。

这里是保存和获取媒体的代码:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { @try { [self.cameraUI dismissViewControllerAnimated:YES completion:nil]; mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; // If mediaURL is not null this should be a video if(mediaURL) { // This video is new just recorded with camera if (self.source == UIImagePickerControllerSourceTypeCamera) { // First save the video to photos album ALAssetsLibrary *library = [ALAssetsLibrary new]; [library writeVideoAtPathToSavedPhotosAlbum:mediaURL completionBlock:^(NSURL *assetURL, NSError *error){ if (error) { DDLogDebug(@"Failed to save the photo to photos album..."); } else { // Get the name of the video [self getMediaName:nil url:assetURL]; } }]; } else { // This is a video that recorded before // Get the name of the video [self getMediaName:nil url:[info objectForKey:UIImagePickerControllerReferenceURL]]; } } // This is an image else { self.originalImage = (UIImage*)[info objectForKey:UIImagePickerControllerOriginalImage]; // This image is new just taken with camera if (self.source == UIImagePickerControllerSourceTypeCamera) { // First save the image to photos album ALAssetsLibrary *library = [ALAssetsLibrary new]; [library writeImageToSavedPhotosAlbum:[self.originalImage CGImage] orientation:(ALAssetOrientation)[self.originalImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){ if (error) { DDLogDebug(@"Failed to save the vide to photos album..."); } else { // Get the name of the image [self getMediaName:self.originalImage url:assetURL]; } }]; } else { // This is an image that taken before // Get the name of the image [self getMediaName:self.originalImage url:[info objectForKey:@"UIImagePickerControllerReferenceURL"]]; } } } @catch (NSException *exception) { DDLogError(@"%@", [exception description]); } } 

获取媒体名称的实际方法:

 - (void)getMediaName:(UIImage*)originalImage url:(NSURL*)url { @try { ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) { if (asset == nil) return; ALAssetRepresentation *assetRep = [asset defaultRepresentation]; NSString *fileName = [assetRep filename]; // Do what you need with the file name here }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error) { DDLogError(@"Failed to get image or video name : %@", error); }; ALAssetsLibrary *library = [ALAssetsLibrary new]; [library assetForURL:url resultBlock:resultblock failureBlock:failureblock]; } @catch (NSException *exception) { DDLogError(@"%@", [exception description]); } } 

您使用相机从应用程序中捕获的图像没有名称。 它总是零。 您必须以编程方式将图像保存在照片库中,并且可以使用任何名称进行保存。

将下面的代码放在didFinishPickingMediaWithInfo中:

 NSURL *mediaUrl; NSString *imageURLString; self.selectImage = [info valueForKey:UIImagePickerControllerEditedImage]; if (mediaUrl == nil) { if (self.selectImage == nil) { self.selectImage = [info valueForKey:UIImagePickerControllerOriginalImage]; DebugLog(@"Original image picked."); }else { DebugLog(@"Edited image picked."); } } mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL]; imageURLString=[mediaUrl absoluteString]; DebugLog(@"Hi Image URL STRING : - %@",imageURLString); if ([StringUtils string:imageURLString contains:@"PNG"] || [StringUtils string:imageURLString contains:@"png"]) { self.isJPG = NO; self.profileImageName = @"profileImageName.png"; } else if ([StringUtils string:imageURLString contains:@"JPG"] || [StringUtils string:imageURLString contains:@"jpg"]) { self.isJPG = YES; self.profileImageName = @"profileImageName.jpg"; } 

当你为kUTTypeMovie设置相机,那么只有你会得到referenceurl和mediaurl。 它将为kUTTypeImage返回null。

Interesting Posts