Phonegap / Cordova相机插件 - 如何获取照片的日期/时间戳?

7
我有一个Phonegap应用程序,需要让用户使用手机相机拍照,并选择设备上已有的照片。 我需要捕获照片拍摄的日期/时间作为元数据的一部分,但我很难弄清楚如何在Phonegap / Cordova中实现这一点。
起初,我认为可以使用File API的FileEntry.getMetadata()调用,但是这不会返回修改时间属性的有效日期。我认为phonegap也会转换设备上的文件,因此即使getMetadata()调用起作用,日期也不会是正确的日期。
除了为每个需要的平台编写自己的相机插件版本之外,还有其他方法吗?
似乎这是唯一的解决方法看起来有些荒谬。
2个回答

8

所以,我已经成功解决了问题。

日期/时间戳和其他信息可以从JPEG文件内部的EXIF数据标签中获取。可以使用这个有用的JS库 - https://github.com/jseidelin/exif-js 来实现。

不幸的是,安卓的 Cordova 相机插件在从相册选择图片并转换时不会复制 EXIF 标签,只有在使用相机拍照时才会复制,因此这是一个问题,但我将通过分叉该插件来解决这个问题。iOS 版本的插件似乎做得很好。

代码供有兴趣的人参考 -

var source = fromCamera 
       ? Camera.PictureSourceType.CAMERA 
       : Camera.PictureSourceType.PHOTOLIBRARY;

var opts = {
    encodingType: Camera.EncodingType.JPEG,
    sourceType: source,
    destinationType: Camera.DestinationType.NATIVE_URI
};

navigator.camera.getPicture(
        function(imageURI) {
            window.resolveLocalFileSystemURL(imageURI,
                    function(entry) {
                        entry.file(function(file) {
                            EXIF.getData(file, function() {
                                var datetime = EXIF.getTag(this, "DateTimeOriginal");
                                alert(datetime);
                            });                                                

                            // do something useful....

                        }, standardErrorHandler);
                    },
                    function(e) {
                        alert('Unexpected error obtaining image file.');
                        standardErrorHandler(e);
                    });
        },
        function() {
            // nada - cancelled
        },
        opts);

谢谢,这对我在iOS上也有帮助,因为camera.getPicture似乎也会剥离EXIF数据。 - Thilo
2
我在ios模拟器上做这件事遇到了问题。 DateTimeOriginal标签不可用。 如果将EXIF.getTag()更改为EXIF.getAllTags(),然后打印出每个标签,我只会得到以下内容:ExifIFDPointerColorSpacePixelXDimensionPixelYDimension - leon.nk
2
可用的标签取决于JPEG源。我尝试过的实际手机设备支持DateTimeOriginal标签,但您应该处理期望的标签不存在的情况,并提供默认值(或引发错误等)。 - Richard Nichols
@RichardNichols,你已经解决了从相册获取照片创建日期的问题吗?我正在尝试你的代码,但是我得到的日期总是当前日期,而不是照片的创建日期(我在使用Android)。 - João Pimentel Ferreira
我也遇到了这个问题。我发现你只能获取插件公开的EXIF标签。要获取所有元数据,你必须去源头。 - michael

2

就像其他人一样,我不喜欢那种以“完全用另一种方式做”开头的答案。但是,我和原帖作者遇到了同样的问题,使用cordova-plugin-camera-with-exif这个备用相机插件是我找到的最佳解决方案。


我刚刚尝试了ionic v4 + angular,并且它仍然像广告中宣传的那样工作。 - michael
当我们在安卓设备上进行拍照时,它除了提供图像路径之外,什么也不显示。 - Code_S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接