iPhone获取UIImagePickerController Lat / Lng

时间:2011-05-30 14:36:58

标签: iphone objective-c ios uiimagepickercontroller

我正在使用UIImagePickerController拍摄照片,然后将照片上传到WCF Service。除了图像,我还需要发送到照片的纬度和经度。

如何从拍摄的照片中获取此信息?

我在线搜索但似乎无法找到一个好的信息来源。我已经看到了作为EXIF委托方法的一部分通过UIImagePickerControllerMediaMetadata密钥传递的didFinishPickingMediaWithInfo数据。但是,当我将内容打印到日志时,没有位置信息。

我错过了什么,在拍照之前是否需要开启位置服务?或者有另一种获取信息的方式吗?

非常感谢。

4 个答案:

答案 0 :(得分:15)

我已经想好了几天,最后得到了解决方案。如上所述,您可以使用 ALAssetsLibrary

图像选择器会为您提供一个字典,其中包含指向资产的网址。

ALAssetsLibrary assetForURL: resultBlock: failureBlock:方法使用块。您可以从示例here中了解有关它们的更多信息。 所以这就是我们处理选择器给出的信息的方式:

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

    if ([picker sourceType] == UIImagePickerControllerSourceTypePhotoLibrary) {
        // We'll store the info to use in another function later
        self.imageInfo = info;

        // Get the asset url
        NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"];

        // We need to use blocks. This block will handle the ALAsset that's returned: 
        ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
        {
            // Get the location property from the asset  
            CLLocation *location = [myasset valueForProperty:ALAssetPropertyLocation];
            // I found that the easiest way is to send the location to another method
            [self handleImageLocation:location];
        };
        // This block will handle errors:
        ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
        {
            NSLog(@"Can not get asset - %@",[myerror localizedDescription]);
            // Do something to handle the error
        };


        // Use the url to get the asset from ALAssetsLibrary,
        // the blocks that we just created will handle results
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:url 
                       resultBlock:resultblock
                      failureBlock:failureblock];

    }
    [picker dismissModalViewControllerAnimated:YES];
    [picker release];
}

接下来是处理图像和位置数据的方法:

- handleImageLocation:(CLLocation *)location 
{
    UIImage *image = [self.imageInfo objectForKey:UIImagePickerControllerOriginalImage];
    // Do something with the image and location data...
}

当然,您也可以使用此键通过此方法获取有关图像的其他信息:

ALAssetPropertyType
ALAssetPropertyLocation
ALAssetPropertyDuration
ALAssetPropertyOrientation
ALAssetPropertyDate
ALAssetPropertyRepresentations
ALAssetPropertyURLs

答案 1 :(得分:3)

自iOS 8以来的新功能

现在已弃用 ALAssetLibrary ,这很复杂,请改用 Photos.Framework

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let assertURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
        let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assertURL], options: nil)
        if let asset = fetchResult.firstObject as? PHAsset
        {
            print(asset.location)
        }
    }
}

快速简便:)

答案 2 :(得分:1)

我想这是一个'错误'。 UIImagePickerViewController不会返回您从中选择的图片的位置数据:正如您所发现的那样,它们会从元数据中删除。

但是,如果您使用ALAssetLibrary来获取图片,则可以获取位置数据(以与图像关联的CLLocation对象的形式)。此问题中有一些代码 - iphone image ALAsset problem - 可帮助您从ALAsset获得UIImagePickerController

当然,如果您可以立即从选择器中获取该信息,这将更容易,因此请考虑向Apple提交功能请求。

答案 3 :(得分:1)

由于您的源类型似乎是UIImagePickerControllerSourceTypeCamera,因此您很快就会非常沮丧,正如您已经知道的那样。位置信息似乎是MIA。

作为UIImageWriteToSavedPhotosAlbum()(不参考已保存的图片)的替代方案,我尝试了 ALAssetsLibrary -writeImageToSavedPhotosAlbum:metadata:completionBlock:(使用UIImagePickerControllerMediaMetadata填充它,希望框架填写位置信息的空白。)

唉,没有这样的运气。即使此方法返回了保存图像的URL,我仍然无法从中获取ALAssetPropertyLocation信息。即使我使用save方法的方向变体,也没用。

此时,我认为唯一的办法似乎是incorporating your own location info, as outlined here

我必须这样做似乎有点可疑,但是,因为我希望框架能够自动处理这个。事实上,我甚至无法获取之前拍摄照片的位置信息。这是在所有正确位置授予的所有权限,无论我使用哪种设备,iPhone或iPad。 (即使是相机应用程序有适当的权限,FWIW。)