fixed metadata reading across multiple directories of same type (continued)

This commit is contained in:
Thibault Deckers 2020-08-27 23:30:55 +09:00
parent 00c65e4838
commit c3dc4801f6
2 changed files with 36 additions and 46 deletions

View file

@ -246,14 +246,13 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
Metadata metadata = ImageMetadataReader.readMetadata(is); Metadata metadata = ImageMetadataReader.readMetadata(is);
// File type // File type
FileTypeDirectory fileTypeDir = metadata.getFirstDirectoryOfType(FileTypeDirectory.class); for (FileTypeDirectory dir : metadata.getDirectoriesOfType(FileTypeDirectory.class)) {
if (fileTypeDir != null) {
// the reported `mimeType` (e.g. from Media Store) is sometimes incorrect // the reported `mimeType` (e.g. from Media Store) is sometimes incorrect
// file extension is unreliable // file extension is unreliable
// `context.getContentResolver().getType()` sometimes return incorrect value // `context.getContentResolver().getType()` sometimes return incorrect value
// `MediaMetadataRetriever.setDataSource()` sometimes fail with `status = 0x80000000` // `MediaMetadataRetriever.setDataSource()` sometimes fail with `status = 0x80000000`
if (fileTypeDir.containsTag(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE)) { if (dir.containsTag(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE)) {
metadataMap.put(KEY_MIME_TYPE, fileTypeDir.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE)); metadataMap.put(KEY_MIME_TYPE, dir.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE));
} }
} }
@ -264,9 +263,8 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
} }
// GPS // GPS
GpsDirectory gpsDir = metadata.getFirstDirectoryOfType(GpsDirectory.class); for (GpsDirectory dir : metadata.getDirectoriesOfType(GpsDirectory.class)) {
if (gpsDir != null) { GeoLocation geoLocation = dir.getGeoLocation();
GeoLocation geoLocation = gpsDir.getGeoLocation();
if (geoLocation != null) { if (geoLocation != null) {
metadataMap.put(KEY_LATITUDE, geoLocation.getLatitude()); metadataMap.put(KEY_LATITUDE, geoLocation.getLatitude());
metadataMap.put(KEY_LONGITUDE, geoLocation.getLongitude()); metadataMap.put(KEY_LONGITUDE, geoLocation.getLongitude());
@ -274,9 +272,8 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
} }
// XMP // XMP
XmpDirectory xmpDir = metadata.getFirstDirectoryOfType(XmpDirectory.class); for (XmpDirectory dir : metadata.getDirectoriesOfType(XmpDirectory.class)) {
if (xmpDir != null) { XMPMeta xmpMeta = dir.getXMPMeta();
XMPMeta xmpMeta = xmpDir.getXMPMeta();
try { try {
if (xmpMeta.doesPropertyExist(XMP_DC_SCHEMA_NS, XMP_SUBJECT_PROP_NAME)) { if (xmpMeta.doesPropertyExist(XMP_DC_SCHEMA_NS, XMP_SUBJECT_PROP_NAME)) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -301,10 +298,9 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
if (MimeTypes.GIF.equals(mimeType)) { if (MimeTypes.GIF.equals(mimeType)) {
metadataMap.put(KEY_IS_ANIMATED, metadata.containsDirectoryOfType(GifAnimationDirectory.class)); metadataMap.put(KEY_IS_ANIMATED, metadata.containsDirectoryOfType(GifAnimationDirectory.class));
} else if (MimeTypes.WEBP.equals(mimeType)) { } else if (MimeTypes.WEBP.equals(mimeType)) {
WebpDirectory webpDir = metadata.getFirstDirectoryOfType(WebpDirectory.class); for (WebpDirectory dir : metadata.getDirectoriesOfType(WebpDirectory.class)) {
if (webpDir != null) { if (dir.containsTag(WebpDirectory.TAG_IS_ANIMATION)) {
if (webpDir.containsTag(WebpDirectory.TAG_IS_ANIMATION)) { metadataMap.put(KEY_IS_ANIMATED, dir.getBoolean(WebpDirectory.TAG_IS_ANIMATION));
metadataMap.put(KEY_IS_ANIMATED, webpDir.getBoolean(WebpDirectory.TAG_IS_ANIMATION));
} }
} }
} }
@ -447,8 +443,7 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
// convenience methods // convenience methods
private static <T extends Directory> void putDateFromDirectoryTag(Map<String, Object> metadataMap, String key, Metadata metadata, Class<T> dirClass, int tag) { private static <T extends Directory> void putDateFromDirectoryTag(Map<String, Object> metadataMap, String key, Metadata metadata, Class<T> dirClass, int tag) {
Directory dir = metadata.getFirstDirectoryOfType(dirClass); for (T dir : metadata.getDirectoriesOfType(dirClass)) {
if (dir != null) {
putDateFromTag(metadataMap, key, dir, tag); putDateFromTag(metadataMap, key, dir, tag);
} }
} }

View file

@ -190,51 +190,46 @@ public class SourceImageEntry {
Metadata metadata = ImageMetadataReader.readMetadata(is); Metadata metadata = ImageMetadataReader.readMetadata(is);
if (MimeTypes.JPEG.equals(sourceMimeType)) { if (MimeTypes.JPEG.equals(sourceMimeType)) {
JpegDirectory jpegDir = metadata.getFirstDirectoryOfType(JpegDirectory.class); for (JpegDirectory dir : metadata.getDirectoriesOfType(JpegDirectory.class)) {
if (jpegDir != null) { if (dir.containsTag(JpegDirectory.TAG_IMAGE_WIDTH)) {
if (jpegDir.containsTag(JpegDirectory.TAG_IMAGE_WIDTH)) { width = dir.getInt(JpegDirectory.TAG_IMAGE_WIDTH);
width = jpegDir.getInt(JpegDirectory.TAG_IMAGE_WIDTH);
} }
if (jpegDir.containsTag(JpegDirectory.TAG_IMAGE_HEIGHT)) { if (dir.containsTag(JpegDirectory.TAG_IMAGE_HEIGHT)) {
height = jpegDir.getInt(JpegDirectory.TAG_IMAGE_HEIGHT); height = dir.getInt(JpegDirectory.TAG_IMAGE_HEIGHT);
} }
} }
ExifIFD0Directory exifDir = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); for (ExifIFD0Directory dir : metadata.getDirectoriesOfType(ExifIFD0Directory.class)) {
if (exifDir != null) { if (dir.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
if (exifDir.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) { orientationDegrees = getOrientationDegreesForExifCode(dir.getInt(ExifIFD0Directory.TAG_ORIENTATION));
orientationDegrees = getOrientationDegreesForExifCode(exifDir.getInt(ExifIFD0Directory.TAG_ORIENTATION));
} }
if (exifDir.containsTag(ExifIFD0Directory.TAG_DATETIME)) { if (dir.containsTag(ExifIFD0Directory.TAG_DATETIME)) {
sourceDateTakenMillis = exifDir.getDate(ExifIFD0Directory.TAG_DATETIME, null, TimeZone.getDefault()).getTime(); sourceDateTakenMillis = dir.getDate(ExifIFD0Directory.TAG_DATETIME, null, TimeZone.getDefault()).getTime();
} }
} }
} else if (MimeTypes.MP4.equals(sourceMimeType)) { } else if (MimeTypes.MP4.equals(sourceMimeType)) {
Mp4VideoDirectory mp4VideoDir = metadata.getFirstDirectoryOfType(Mp4VideoDirectory.class); for (Mp4VideoDirectory dir : metadata.getDirectoriesOfType(Mp4VideoDirectory.class)) {
if (mp4VideoDir != null) { if (dir.containsTag(Mp4VideoDirectory.TAG_WIDTH)) {
if (mp4VideoDir.containsTag(Mp4VideoDirectory.TAG_WIDTH)) { width = dir.getInt(Mp4VideoDirectory.TAG_WIDTH);
width = mp4VideoDir.getInt(Mp4VideoDirectory.TAG_WIDTH);
} }
if (mp4VideoDir.containsTag(Mp4VideoDirectory.TAG_HEIGHT)) { if (dir.containsTag(Mp4VideoDirectory.TAG_HEIGHT)) {
height = mp4VideoDir.getInt(Mp4VideoDirectory.TAG_HEIGHT); height = dir.getInt(Mp4VideoDirectory.TAG_HEIGHT);
} }
} }
Mp4Directory mp4Dir = metadata.getFirstDirectoryOfType(Mp4Directory.class); for (Mp4Directory dir : metadata.getDirectoriesOfType(Mp4Directory.class)) {
if (mp4Dir != null) { if (dir.containsTag(Mp4Directory.TAG_DURATION)) {
if (mp4Dir.containsTag(Mp4Directory.TAG_DURATION)) { durationMillis = dir.getLong(Mp4Directory.TAG_DURATION);
durationMillis = mp4Dir.getLong(Mp4Directory.TAG_DURATION);
} }
} }
} else if (MimeTypes.AVI.equals(sourceMimeType)) { } else if (MimeTypes.AVI.equals(sourceMimeType)) {
AviDirectory aviDir = metadata.getFirstDirectoryOfType(AviDirectory.class); for (AviDirectory dir : metadata.getDirectoriesOfType(AviDirectory.class)) {
if (aviDir != null) { if (dir.containsTag(AviDirectory.TAG_WIDTH)) {
if (aviDir.containsTag(AviDirectory.TAG_WIDTH)) { width = dir.getInt(AviDirectory.TAG_WIDTH);
width = aviDir.getInt(AviDirectory.TAG_WIDTH);
} }
if (aviDir.containsTag(AviDirectory.TAG_HEIGHT)) { if (dir.containsTag(AviDirectory.TAG_HEIGHT)) {
height = aviDir.getInt(AviDirectory.TAG_HEIGHT); height = dir.getInt(AviDirectory.TAG_HEIGHT);
} }
if (aviDir.containsTag(AviDirectory.TAG_DURATION)) { if (dir.containsTag(AviDirectory.TAG_DURATION)) {
durationMillis = aviDir.getLong(AviDirectory.TAG_DURATION); durationMillis = dir.getLong(AviDirectory.TAG_DURATION);
} }
} }
} }