From aa8451210788bbecefab38543970e8ceb18bd14d Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 14 May 2020 18:18:15 +0900 Subject: [PATCH] fixed crash on older devices because of missing method --- .../aves/channelhandlers/MetadataHandler.java | 12 ++++++++++-- .../thibault/aves/decoder/VideoThumbnailFetcher.java | 6 +++++- .../java/deckers/thibault/aves/model/ImageEntry.java | 6 +++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/java/deckers/thibault/aves/channelhandlers/MetadataHandler.java b/android/app/src/main/java/deckers/thibault/aves/channelhandlers/MetadataHandler.java index 34322e595..0874f733b 100644 --- a/android/app/src/main/java/deckers/thibault/aves/channelhandlers/MetadataHandler.java +++ b/android/app/src/main/java/deckers/thibault/aves/channelhandlers/MetadataHandler.java @@ -153,7 +153,8 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler { // unnamed fallback directory metadataMap.put("", dirMap); - try (MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri), path)) { + MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri), path); + try { for (Map.Entry kv : Constants.MEDIA_METADATA_KEYS.entrySet()) { Integer key = kv.getKey(); String value = retriever.extractMetadata(key); @@ -172,6 +173,9 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler { result.success(metadataMap); } catch (Exception e) { result.error("getAllVideoMetadataFallback-exception", "failed to get metadata for uri=" + uri + ", path=" + path, e.getMessage()); + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release(); } } @@ -240,7 +244,8 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler { } if (isVideo(mimeType)) { - try (MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri), path)) { + MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri), path); + try { String dateString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE); String rotationString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); String locationString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_LOCATION); @@ -276,6 +281,9 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler { } } catch (Exception e) { result.error("getCatalogMetadata-exception", "failed to get video metadata for uri=" + uri + ", path=" + path, e.getMessage()); + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release(); } } result.success(metadataMap); diff --git a/android/app/src/main/java/deckers/thibault/aves/decoder/VideoThumbnailFetcher.java b/android/app/src/main/java/deckers/thibault/aves/decoder/VideoThumbnailFetcher.java index 9cea8aea2..7c8ec33be 100644 --- a/android/app/src/main/java/deckers/thibault/aves/decoder/VideoThumbnailFetcher.java +++ b/android/app/src/main/java/deckers/thibault/aves/decoder/VideoThumbnailFetcher.java @@ -24,7 +24,8 @@ class VideoThumbnailFetcher implements DataFetcher { @Override public void loadData(@NonNull Priority priority, @NonNull DataCallback callback) { - try (MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(model.getContext(), model.getUri(), null)) { + MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(model.getContext(), model.getUri(), null); + try { byte[] picture = retriever.getEmbeddedPicture(); if (picture != null) { callback.onDataReady(new ByteArrayInputStream(picture)); @@ -40,6 +41,9 @@ class VideoThumbnailFetcher implements DataFetcher { } } catch (Exception ex) { callback.onLoadFailed(ex); + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release(); } } diff --git a/android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java b/android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java index 4368bbdb1..c39e0f213 100644 --- a/android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java +++ b/android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java @@ -137,7 +137,8 @@ public class ImageEntry { // expects entry with: uri/path, mimeType // finds: width, height, orientation/rotation, date, title, duration private void fillByMediaMetadataRetriever(Context context) { - try (MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, uri, path)) { + MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, uri, path); + try { String width = null, height = null, rotation = null, durationMillis = null; if (isImage()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { @@ -177,6 +178,9 @@ public class ImageEntry { } } catch (Exception e) { // ignore + } finally { + // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs + retriever.release(); } }