2012-01-25 18 views
5

Tôi đã nghiên cứu và thử nhiều tùy chọn để thử và làm việc này nhưng không nhận được bất kỳ nơi nào với điều này.Không thể đặt Ngày Lấy/Thẻ ngày giờ bằng cách sử dụng ExifInterface trong Android

Điều tôi đang cố gắng làm là đặt thẻ Ngày chụp (Tag_DateTime) trong dữ liệu Exif của JPEG từ trong ứng dụng Android. Tôi đã có mã số làm việc để thiết lập các thẻ Latitude và Longitute, nhưng không thể cho cuộc sống của tôi nhận được thẻ Ngày chụp để thiết lập.

Đây là mã:

SimpleDateFormat fmt_Exif = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 
try { 
    ExifInterface exif = new ExifInterface(filePhoto.getPath()); 

    // Set and save the GPS and time data 
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, strLat); 
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, strLong); 
    exif.setAttribute(ExifInterface.TAG_DATETIME, fmt_Exif.format(locLatestLocation.getTime())); 
    exif.saveAttributes(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 
  • locLatestLocation - Vị trí được sử dụng để có được thời gian trong mili giây.
  • fmt_Exif - SimpleDateFormat được sử dụng để định dạng thời gian mili giây sang định dạng chính xác cho thẻ TAG_DateTime Exif.
  • strLat & strLong - Được điền ở nơi khác ở định dạng chính xác để đặt thẻ Latitude và Kinh độ.

Tôi đọc trong một bài đăng ở đâu đó rằng thẻ cần phải được viết theo định dạng mili giây, vì vậy đã thử điều này quá vô ích. Để xác nhận định dạng của tôi với những gì thực sự được lưu trữ, tôi đọc và xuất ra thẻ chưa được định dạng từ tệp jpeg có thẻ Ngày được lấy, nhưng đầu ra ở định dạng chính xác như những gì tôi đang viết cho thẻ và vẫn không làm việc. Nó cũng có thể đáng nói rằng tôi đã nhìn vào lớp Sanselan để làm điều này, và do sự phức tạp và thiếu các ví dụ sẽ cố gắng và làm cho giải pháp hiện tại của tôi hoạt động trước khi chuyển sang một giải pháp hoàn toàn khác.

Có ai quản lý để làm điều này và nếu vậy tôi đang làm gì sai ??

+0

Bạn đã tìm thấy giải pháp nào chưa? Nếu tôi cố gắng thiết lập trường "DateTime", có hai trường như vậy trong dữ liệu EXIF ​​sau khi lưu ... – pbu

Trả lời

4

ExifInterface của Android, gây phiền nhiễu, âm thầm loại bỏ mọi dữ liệu được cho là không hợp lệ. Tệ hơn nữa, tài liệu thậm chí không đề cập đến những giá trị hợp lệ có thể là gì. Tôi cũng thấy rằng nếu bạn chỉ định một thuộc tính EXIF ​​mà Android không thể tìm ra (IE: nó không phải là một trong các hằng số TAG_ của ExifInterface), nó cũng sẽ hoàn toàn bỏ qua nó, và cũng không âm thầm.

2

Tôi có cùng vấn đề với bạn. Khi tôi cố gắng sử dụng TAG_DATETIME để lưu ngày đã chụp, nó không hoạt động và ngày chụp ban đầu đã bị mất. Tôi thực sự không biết sự khác biệt giữa hàm @hide của getDateTime() và getGpsDateTime(). Dường như getGpsDateTime() là ngày được lấy. Và tôi sẽ thử TAG_GPS_DATESTAMP và TAG_GPS_TIMESTAMP.

/** 
* Returns number of milliseconds since Jan. 1, 1970, midnight UTC. 
* Returns -1 if the date time information if not available. 
* @hide 
*/ 
public long getGpsDateTime() { 
    String date = mAttributes.get(TAG_GPS_DATESTAMP); 
    String time = mAttributes.get(TAG_GPS_TIMESTAMP); 
    if (date == null || time == null) return -1; 

    String dateTimeString = date + ' ' + time; 
    if (dateTimeString == null) return -1; 

    ParsePosition pos = new ParsePosition(0); 
    try { 
     Date datetime = sFormatter.parse(dateTimeString, pos); 
     if (datetime == null) return -1; 
     return datetime.getTime(); 
    } catch (IllegalArgumentException ex) { 
     return -1; 
    } 
} 
6

Tôi cần điều tương tự ngay bây giờ. Tôi đã đọc EXIF article from MIT và tôi đã nhận TAG_DATETIME được viết:

exif.setAttribute(ExifInterface.TAG_DATETIME,"2013:06:21 00:00:07"); 
exif.setAttribute(ExifInterface.TAG_GPS_DATESTAMP,"2013:06:21"); 
exif.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP,"00:00:07"); 

nào trông như thế này xem trước:

exif 1

exif 2

Lưu ý rằng đây trong EXIF ​​/ TIFF và phần GPS chỉ, không phải là dấu thời gian gốc và số hóa thực tế:

exif 3

tôi muốn thay đổi timestamps gốc và số hóa quá, vì vậy thử JHeader thư viện:

try { 
        JpegHeaders headers = new JpegHeaders(FakeBurst.PICTURE_PATH); 
        App1Header app1Header = headers.getApp1Header(); 
        app1Header.setValue(new TagValue(Tag.IMAGEDESCRIPTION,"bla bla bla")); 
        app1Header.setValue(new TagValue(Tag.DATETIMEORIGINAL,"2013:06:21 00:00:07")); 
        app1Header.setValue(new TagValue(Tag.DATETIMEDIGITIZED,"2013:06:21 00:00:07")); 
        headers.save(true); 
        System.out.println(this+" wrote exif timestamp"); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

với điều này thêm vào trong onCreate:

JpegHeaders.preheat(); 

và nó làm việc:

exif 4

exif 5

Tôi thấy bài này là từ ngày như vậy có lẽ mã Android ExifInterface tôi đã đăng ở trên không làm việc với phiên bản của SDK, nhưng tôi đoán thư viện phương pháp JHeader sẽ làm việc.

1

Bạn có thể thử giống như họ đã làm trong ExifInterface.java

private static SimpleDateFormat sFormatter; 

    static { 
     sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 
     sFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
    } 

Và sau đó cập nhật:

exif.setAttribute(ExifInterface.TAG_DATETIME, 
          sFormatter.format(new Date(System.currentTimeMillis()))); 
0
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 

exifInterface.setAttribute("DateTimeOriginal", dateTimeFormat.format(date)); 
exifInterface.setAttribute("DateTimeDigitized", dateTimeFormat.format(date)); 

đó làm việc cho tôi (ít nhất là mức API 14 +)

-1

Tôi gặp sự cố hình ảnh từ Nexus 6 và Lumia 935 không có CreateDateDateTimeOriginal trường.

Android và Windows phone lưu dấu thời gian còn trên filename IMG_20160320_145825.jpg WP_20160328_13_40_42_Pro.jpg

Tôi thành công để khắc phục vấn đề này và thêm lĩnh vực này chạy kịch bản này:

#! /bin/bash 

COUNTER=0 
for filename in ./* 
do 
    case "$filename" in 
     *.JPG|*.jpeg|*.jpg) 
      COUNTER=$[$COUNTER +1] 
      y=${filename:6:4} 
      M=${filename:10:2} 
      d=${filename:12:2} 
      H=${filename:15:2} 
      m=${filename:17:2} 
      s=${filename:19:2} 
      echo "'"$y":"$M":"$d $H":"$m":"$s"'" " --> "$filename 
      exiftool -v2 -AllDates="'"$y":"$M":"$d" "$H":"$m":"$s"'" -overwrite_original $filename 
      ;; 
     *) 
      echo $filename 'Not a *.jpg' 
      ;; 
    esac 
done 

echo $COUNTER "files updated" 

tôi hy vọng nó giúp ai đó