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的主要内容,如果未能解决你的问题,请参考以下文章
SVG 覆盖在 UIImagePickerController 之上,UIImagePickerController 响应手势(iPhone/iOS)