UIImagePickerController 相机不提供​​ URL

Posted

技术标签:

【中文标题】UIImagePickerController 相机不提供​​ URL【英文标题】:UIImagePickerController camera provides no URL 【发布时间】:2015-06-10 22:26:54 【问题描述】:

我有一个我正在开发的应用程序,直到几天前才允许某人从他们的照片库上传照片。它完美运行,并检查元数据中的 GPS 坐标并进行条件比较。

然而,现在我决定让他们通过应用程序拍摄照片,但遇到了障碍。用于照片挑选的代码在使用相机时效果不佳。

这是我上传照片的按钮的原始代码:

    @IBAction func pickPhoto(sender: AnyObject) 
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum) 
        imageView.hidden = true

        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
        imagePicker.allowsEditing = false

        presentViewController(imagePicker, animated: true, completion: nil)
    

然后是 UIImagePickerController:

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) 

    imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage

    println("imagePickerController")

    let library = ALAssetsLibrary()

    let url: NSURL = info[UIImagePickerControllerReferenceURL] as! NSURL

    library.assetForURL(url, resultBlock: 
        (asset: ALAsset!) in

        if  asset.valueForProperty(ALAssetPropertyLocation) != nil 

            println("!= nil")
            let imageLongitude = (asset.valueForProperty(ALAssetPropertyLocation) as! CLLocation!).coordinate.longitude
            let imageLatitude = (asset.valueForProperty(ALAssetPropertyLocation) as! CLLocation!).coordinate.latitude

            println("imageLatitude = \(imageLatitude)")
            println("imageLongitude = \(imageLongitude)")

            println("Starting the Location check")

...然后它会从那里继续进行更多检查。

我复制了我的 pickPhoto 按钮并将其变成了一个 takePhoto 按钮,如下所示:

    @IBAction func takePhoto(sender: AnyObject) 
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) 
        imageView.hidden = true

        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
        imagePicker.allowsEditing = false

        presentViewController(imagePicker, animated: true, completion: nil)
     else 

        notifyUser("No Camera", message: "This device doesn't have a camera!")
    

然后打开相机让我拍照。但是,当我使用照片时,我立即在这一行的 UIImagePickerController 中崩溃:

let url: NSURL = info[UIImagePickerControllerReferenceURL] as! NSURL

我假设这是因为作为相机图像,从技术上讲,它不会保存在任何地方,因此它没有 URL 或路径。

所以我的问题是,我如何保存图像(暂时或在相机胶卷中),保持相机中的 GPS 元数据完好无损(假设定位服务处于活动状态),这样我就可以传递它并让它发挥得很好?

【问题讨论】:

【参考方案1】:

编辑:

此帖已过时


Swift 2.x

正如您已经注意到的,您需要将文件保存到磁盘才能获取其 url。您必须将其保存到您的相机 SavedPhotosAlbum 或您的文档文件夹中。您还需要保存图像元数据信息)UIImagePickerControllerMediaMetadata)如下:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 
    
    print(info["UIImagePickerControllerOriginalImage"] ?? "NO IMAGE")
    print(info["UIImagePickerControllerReferenceURL"] ?? "NO URL")
    print(info["UIImagePickerControllerMediaMetadata"] ?? "NO METADATA")

    if let image = info["UIImagePickerControllerOriginalImage"] as? UIImage 
        ALAssetsLibrary().writeImageToSavedPhotosAlbum(image.CGImage!, metadata: info[UIImagePickerControllerMediaMetadata]! as! [NSObject : AnyObject], completionBlock:  (url, error) -> Void in
            
            print("photo saved to asset")
            print(url)   // assets-library://asset/asset.JPG?id=CCC70B9F-748A-43F2-AC61-8755C974EE15&ext=JPG
            
            
            // you can load your UIImage that was just saved to your asset as follow
            let assetLibrary = ALAssetsLibrary()
            assetLibrary.assetForURL(url,
                resultBlock:  (asset) -> Void in
                    if let asset = asset 
                        let assetImage =  UIImage(CGImage:  asset.defaultRepresentation().fullResolutionImage().takeUnretainedValue())
                        print(assetImage)
                    
                , failureBlock:  (error) -> Void in
                if let error = error  print(error.description) 
            )

            if let error = error  print(error.description) 
            self.dismissViewControllerAnimated(true, completion: nil)
        )
    

【讨论】:

感谢您的回复。但是,除非我做错了什么,否则 GPS 数据不会通过。照片正在保存到相机胶卷,它找到了 URL(太棒了!),但打印到控制台的 EXIF 数据缺少纬度和经度信息。我让应用程序在使用应用程序时请求位置服务权限。也许相机不会通过另一个应用程序自动收集快照中的 GPS 坐标?我不知道。如果我去我的照片,我会看到我的其他照片与我的城市名称一起列出。不过刚才用相机拍的照片,没有。 忘了把标签放在那里让你知道我回复了。 ALAssets 在 ios9 中已被弃用。您应该使用 PHAsset 而不是 ALAsset

以上是关于UIImagePickerController 相机不提供​​ URL的主要内容,如果未能解决你的问题,请参考以下文章

在iPad iOS8环境下打开相冊或者拍照

SVG 覆盖在 UIImagePickerController 之上,UIImagePickerController 响应手势(iPhone/iOS)

UIImagePickerController 不是全屏

UIImagePickerController、自定义 UIButton 和 AutoLayout

UIImagePickerController 实况照片

OCMock 模拟 UIImagePickerController