문제

I am trying to get the name of the image which I have just captured from camera with following code. But [info objectForKey:@"UIImagePickerControllerReferenceURL"] always returning nil. 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:

It is a little bit late but here how I get the name of the image or video:

  • Check UIImagePickerControllerMediaURL, if it is null the media is an image if not it is a video
  • If the image or the video is just taken or recorded save it to photos album
  • Use ALAssetsLibrary to query file name.

Here is the code for saving and getting 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]);
    }
}

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]);
    }
}
도움이 되었습니까?

해결책

The image that you capture with the camera from within the application has no name. It is always nil. You have to programmatically save that image in the photo gallery and you can save with any name you want.

다른 팁

Put the following code in 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";

}

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

For Xamarin.iOS developers: store image capture from camera and get its 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);
        });
    });
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top