UIImagePickerControllerReferenceURL始终返回nill [英] UIImagePickerControllerReferenceURL always returns nill

查看:122
本文介绍了UIImagePickerControllerReferenceURL始终返回nill的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用以下代码获取刚刚从相机捕获的图像的名称.但是[info objectForKey:@"UIImagePickerControllerReferenceURL"]总是返回nil.如何获取网址?

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


更新:

有点晚了,但是在这里我如何获得图像或视频的名称:

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

  • 检查UIImagePickerControllerMediaURL,如果它是null,则媒体是图像,如果不是,则是视频
  • 如果只是拍摄或录制了图像或视频,请将其保存到相册
  • 使用ALAssetsLibrary查询文件名.
  • 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.

这篇关于UIImagePickerControllerReferenceURL始终返回nill的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆