6

我正在尝试获取有关我在UIImagePicker.

因此,当它进入UIImagePicker委托方法(如下)时,我知道我需要使用UIImagePickerControllerReferenceURL信息字典中的密钥。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];

    NSLog(@"%@",url);

    [library addAssetURL:[info objectForKey:UIImagePickerControllerReferenceURL] toAlbum:@"Compedia" withCompletionBlock:^(NSError *error) {
        if (error!=nil) {
            NSLog(@"Big error: %@", [error description]);
        }
    }];
}

问题是 url 的结果是 nil。我打印了信息的描述,它看起来像这样:

Printing description of info:
{
    UIImagePickerControllerMediaType = "public.movie";
    UIImagePickerControllerMediaURL = "file://localhost/private/var/mobile/Applications/6630FBD3-1212-4ED0-BC3B-0C23AEEFB267/tmp/capture-T0x1f57e880.tmp.Ulfn5o/capturedvideo.MOV";
}

在我做了一些研究之后,我发现如果我用kUTTypeMovie它设置相机应该给我媒体和参考网址。

这就是我定义我的相机的方式:

cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil];
cameraUI.allowsEditing = YES;
cameraUI.delegate = delegate;
cameraUI.showsCameraControls = NO;
cameraUI.cameraOverlayView = [self getCustomToolBar];

有什么我想念的吗?

谢谢,

4

2 回答 2

13

这一次差点疯掉。我看到的每一个地方,每个人似乎都相信它UIImagePickerControllerReferenceURL总是在那里。

无论如何,问题是,如果在您使用相机拍摄照片后调用您的代表,则该UIImagePickerControllerReferenceURL对象将不存在,因为图像尚未保存到相机胶卷中,因此没有UIImagePickerControllerReferenceURL. 仅在从相机胶卷中选择图像后调用委托时才存在。

所以我解决这个问题的方法是使用 ALAssetLibrary 将其保存到相机胶卷,然后读回 URL。

这是我的解决方案:

首先,您要检测您的PickerControllersourceType 以查看它是相机还是photosLibrary/ savedPhotosAlbum。如果是相机,那么我们使用资源库的 writeImageToSavedPhotosAlbum:orientation:completionBlock: 将图像写入相机胶卷,并在完成块中返回图像 URL。

但是,如果它不是相机,那么这意味着要么是要么在photosLibrarysavedPhotosAlbum两种情况下[info objectForKey:UIImagePickerControllerReferenceURL]都会返回一个有效的 url

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{

//dismiss the imagepicker view
[self dismissViewControllerAnimated:YES completion:nil];


if( [picker sourceType] == UIImagePickerControllerSourceTypeCamera )
{
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    ALAssetsLibrary *library = [Utils defaultAssetsLibrary];
    [library writeImageToSavedPhotosAlbum:image.CGImage orientation:(ALAssetOrientation)image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error )
     {
         //here is your URL : assetURL
     }];
}
else
{
    //else this is valid : [info objectForKey:UIImagePickerControllerReferenceURL]];
}

}

希望有帮助。

于 2013-06-28T02:23:27.317 回答
0

ALAssetsLibrary 已弃用...使用 PHFetchOptions..

请参阅以下答案: https ://stackoverflow.com/a/44328085/5315917

于 2017-06-02T11:45:40.477 回答