UIImagePickerControllerReferenceURL always returns nill

I am trying to get the name of the image I just shot from the camera using the following code. But [info objectForKey:@"UIImagePickerControllerReferenceURL"] always returns zero. How can I get the 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]; } 

UPDATE:

A bit late, but here is how I get the name of the image or video:

  • Check UIImagePickerControllerMediaURL if it is null media - this is an image if it is not a video.
  • If the image or video is just recorded or recorded, save it in the photo album
  • Use ALAssetsLibrary to request a file name.

Here is the code for saving and retrieving media:

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

The actual method that gets the media name:

 - (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]); } } 
+6
source share
3 answers

The image that you shoot with the camera from the application does not have a name. It is always zero. You must programmatically save this image in the photo gallery, and you can save any name you want.

+4
source

Put the following code in the didFinishPickingMediaWithInfo file:

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

When you install the camera for kUTTypeMovie, then you will get only referenceurl and mediaurl. It will return null for kUTTypeImage.

+1
source

For Xamarin.iOS developers: save image capture from the camera and get data using ALAssetsLibrary

 var originalImage = e.Info[UIImagePickerController.OriginalImage] as UIImage; var meta = e.Info[UIImagePickerController.MediaMetadata] as NSDictionary; //Get image bytes if (originalImage != null) { using (NSData imageData = originalImage.AsPNG()) { myByteArray = new Byte[imageData.Length]; System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, myByteArray, 0, Convert.ToInt32(imageData.Length)); } //This bit of code saves image to the Photo Album with metadata ALAssetsLibrary library = new ALAssetsLibrary(); library.WriteImageToSavedPhotosAlbum(originalImage.CGImage, meta, (assetUrl, error) => { library.AssetForUrl(assetUrl, delegate (ALAsset asset) { ALAssetRepresentation representation = asset.DefaultRepresentation; if (representation != null) { string fileName = representation.Filename; var filePath = assetUrl.ToString(); var extension = filePath.Split('.')[1].ToLower(); var mimeData = string.Format("image/{0}", extension); var mimeType = mimeData.Split('?')[0].ToLower(); var documentName = assetUrl.Path.ToString().Split('/')[1]; } }, delegate (NSError err) { Console.WriteLine("User denied access to photo Library... {0}", err); }); }); } 
0
source

Source: https://habr.com/ru/post/977781/


All Articles