diff --git a/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java b/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java index 247eb034e..44dc9653f 100644 --- a/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java +++ b/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java @@ -19,7 +19,6 @@ import com.adobe.internal.xmp.XMPMeta; import com.adobe.internal.xmp.properties.XMPProperty; import com.adobe.internal.xmp.properties.XMPPropertyInfo; import com.drew.imaging.ImageMetadataReader; -import com.drew.imaging.ImageProcessingException; import com.drew.lang.GeoLocation; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; @@ -143,22 +142,24 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler { } } } + } catch (Exception | NoClassDefFoundError e) { + Log.w(LOG_TAG, "failed to get video metadata by ImageMetadataReader for uri=" + uri, e); + } + + Map videoDir = getVideoMetadataByRetriever(uri); + if (!videoDir.isEmpty()) { + metadataMap.put("Video", videoDir); + } + + if (metadataMap.isEmpty()) { + result.error("getAllMetadata-failure", "failed to get metadata for uri=" + uri, null); + } else { result.success(metadataMap); - } catch (ImageProcessingException | NoClassDefFoundError e) { - getAllVideoMetadataFallback(call, result); - } catch (Exception e) { - result.error("getAllMetadata-exception", "failed to get metadata for uri=" + uri, e.getMessage()); } } - private void getAllVideoMetadataFallback(MethodCall call, MethodChannel.Result result) { - String uri = call.argument("uri"); - - Map> metadataMap = new HashMap<>(); + private Map getVideoMetadataByRetriever(String uri) { Map dirMap = new HashMap<>(); - // unnamed fallback directory - metadataMap.put("", dirMap); - MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri)); try { for (Map.Entry kv : Constants.MEDIA_METADATA_KEYS.entrySet()) { @@ -176,13 +177,13 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler { dirMap.put(kv.getValue(), value); } } - result.success(metadataMap); } catch (Exception e) { - result.error("getAllVideoMetadataFallback-exception", "failed to get metadata for uri=" + uri, e.getMessage()); + Log.w(LOG_TAG, "failed to get video metadata by MediaMetadataRetriever for uri=" + uri, e); } finally { // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs retriever.release(); } + return dirMap; } private void getCatalogMetadata(MethodCall call, MethodChannel.Result result) {