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将图片从android画廊分享到cordova应用程序

如何在从cordova创建的本机代码中使用相同的android SQLite DB?

如何在 Android Studio 中更新 Cordova 版本