Cordova 3.6:如何从 Android 的照片库中提取 GPS Exif 数据?
Posted
技术标签:
【中文标题】Cordova 3.6:如何从 Android 的照片库中提取 GPS Exif 数据?【英文标题】:Cordova 3.6: how can I extract GPS Exif data from photo library in Android? 【发布时间】:2015-01-09 15:22:36 【问题描述】:我正在使用带有 Angularjs 的 Cordova 3.6.x 开发应用程序。除了我无法从从照片库中获取的图像的 exif 数据中提取日期和位置之外,一切似乎都运行良好。
我的目标设备是 android 4+
从现在开始我测试了: - https://github.com/lorinbeer/cordova-exif-utility ( 不支持安卓 :( ) -https://github.com/guilhermefarias/cordova-exif(返回错误,例如“processMessage failed: Error: TypeError: Cannot call method 'toString' of undefined”和“processMessage failed: Message: S01 File1189144150”) - https://github.com/kamilersz/cordova-plugin-exif(无法理解它是如何工作的)
在网上我读到 Cordova 在返回图像之前会剥离所有 exif 数据。是不是真的无法获取这些数据?
你能帮我弄清楚如何解决这个问题吗?
更新
我将 Angular 与 ngCordova、ui-router 和 https://github.com/guilhermefarias/cordova-exif 一起使用。所以我正在利用 ui-router 的“解析”功能:
resolve:
picture: ['$cordovaCamera', function($cordovaCamera)
var options =
quality : 75,
destinationType : navigator.camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
allowEdit : false,
correctOrientation: true,
encodingType: Camera.EncodingType.JPEG,
saveToPhotoAlbum: false
;
return $cordovaCamera.getPicture(options); //TODO: we need to handle errors
]
然后在我对应的控制器里面
myApp.controller('UploadController', [ '$范围', '图片', 函数($范围,图片)
//Picture
$scope.snapShot = picture;
CordovaExif.readData(picture, function(exifObject)
console.log(exifObject);
);
等等。
但我收到以下错误 processMessage 失败:错误:TypeError:无法调用未定义的方法“toString” processMessage 失败:堆栈:TypeError:无法调用未定义的方法“toString” 接下来是堆栈跟踪和一个我很确定是 base64 的巨大字符串,即使它不适用于我在线尝试的任何 base64 到图像解码器......
【问题讨论】:
【参考方案1】:您至少对 两个 插件是正确的:
lorinbeer 的 Cordova Exif 实用程序不支持 Android kamilersz 的 cordova-plugin-exif 仅具有用于设置一些 Exif 元数据和从设备获取 Wi-Fi 信息的 API。但是 guilhermefarias 的 Cordova Exif 看起来很有前途,如果你展示你正在尝试的代码,我也许可以帮助你。当然,获取 Exif 并非不可能,因为它是实际文件的一部分。只是 Cordova 的默认相机插件在从图库中选择图像时会丢失 Exif。这似乎做得很好(基于我阅读的代码)并记录在案。
然后也可以将图像作为二进制数据读取并应用Exif.js 之类的内容来读取Exif。请参阅用户 Richard Nichols 的this answer,了解如何执行此操作。
【讨论】:
感谢您的回复。由于我将 Angularjs 与 ngCordova 一起使用,因此我利用了 ui-router 的解析功能,其中我有您将在上面的原始问题中看到的代码。据您所知,是否有任何替代插件不会去除 exif 数据? 我不知道存在任何不会剥离 Exif 的相机插件。但是理查德尼科尔斯的回答很好解决这个问题。关于您的 Cordova Exif 代码,请查看 this 以获取应该可以工作的完整示例。 经过一系列测试后,唯一有效的解决方案是 Richard Nichols 的解决方案。据我所见,当我在 entry.file(function(file) 内部时,我有一个对象可以为我提供文件的 localUrl,因此我也可以将其转换为 base64 并显示实际图像,不是吗? 是的,您可以将其读取为 base64 并显示它,这就是我为我的应用程序所做的。但这与 Exif 有什么关系? 对不起,如果我不清楚。我正在尝试在视图中显示带有位置和日期的图片。无论如何,关于exif,您的解决方案绝对是正确的!非常感谢!【参考方案2】:kamilersz/cordova-plugin-exif 仅用于从设备获取 Wi-fi 信息,因为我将其用于单独分配。您应该使用 guilhermefarias 的 Cordova Exif 和更广泛的 API。
【讨论】:
【参考方案3】:直接取自回购,为了@Shree 的乐趣
完整示例 这个例子展示了它如何简单地获取智能手机拍摄的照片的 exif 信息。
var options =
quality: 90,
sourceType: 2,
destinationType: 1,
;
function onSuccess(imageURI)
CordovaExif.readData(imageURI, function(exifObject)
console.log(exifObject);
);
;
function onFail(message)
console.log('Failed because: ' + message);
;
navigator.camera.getPicture(onSuccess, onFail, options);
【讨论】:
以上是关于Cordova 3.6:如何从 Android 的照片库中提取 GPS Exif 数据?的主要内容,如果未能解决你的问题,请参考以下文章
Cordova 通知插件安装失败 (Cordova 3.6)
如何从 Cordova 中的 android 设备后退按钮退出应用程序?
使用cordova将图片从android画廊分享到cordova应用程序