changed media retriever failure handling

This commit is contained in:
Thibault Deckers 2020-09-18 15:35:57 +09:00
parent 2fc15a126b
commit fe12767b4a
4 changed files with 116 additions and 107 deletions

View file

@ -199,6 +199,7 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
private Map<String, String> getVideoAllMetadataByMediaMetadataRetriever(String uri) { private Map<String, String> getVideoAllMetadataByMediaMetadataRetriever(String uri) {
Map<String, String> dirMap = new HashMap<>(); Map<String, String> dirMap = new HashMap<>();
MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri)); MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri));
if (retriever != null) {
try { try {
for (Map.Entry<Integer, String> kv : VIDEO_MEDIA_METADATA_KEYS.entrySet()) { for (Map.Entry<Integer, String> kv : VIDEO_MEDIA_METADATA_KEYS.entrySet()) {
Integer key = kv.getKey(); Integer key = kv.getKey();
@ -221,6 +222,7 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
// cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs
retriever.release(); retriever.release();
} }
}
return dirMap; return dirMap;
} }
@ -317,6 +319,7 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
private Map<String, Object> getVideoCatalogMetadataByMediaMetadataRetriever(String uri) { private Map<String, Object> getVideoCatalogMetadataByMediaMetadataRetriever(String uri) {
Map<String, Object> metadataMap = new HashMap<>(); Map<String, Object> metadataMap = new HashMap<>();
MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri)); MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, Uri.parse(uri));
if (retriever != null) {
try { try {
String dateString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE); String dateString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);
String rotationString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); String rotationString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
@ -357,6 +360,7 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler {
// cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs
retriever.release(); retriever.release();
} }
}
return metadataMap; return metadataMap;
} }

View file

@ -25,6 +25,7 @@ class VideoThumbnailFetcher implements DataFetcher<InputStream> {
@Override @Override
public void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) { public void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {
MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(model.getContext(), model.getUri()); MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(model.getContext(), model.getUri());
if (retriever != null) {
try { try {
byte[] picture = retriever.getEmbeddedPicture(); byte[] picture = retriever.getEmbeddedPicture();
if (picture != null) { if (picture != null) {
@ -46,6 +47,7 @@ class VideoThumbnailFetcher implements DataFetcher<InputStream> {
retriever.release(); retriever.release();
} }
} }
}
@Override @Override
public void cleanup() { public void cleanup() {

View file

@ -135,6 +135,7 @@ public class SourceImageEntry {
// finds: width, height, orientation/rotation, date, title, duration // finds: width, height, orientation/rotation, date, title, duration
private void fillByMediaMetadataRetriever(@NonNull Context context) { private void fillByMediaMetadataRetriever(@NonNull Context context) {
MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, uri); MediaMetadataRetriever retriever = StorageUtils.openMetadataRetriever(context, uri);
if (retriever != null) {
try { try {
String width = null, height = null, rotation = null, durationMillis = null; String width = null, height = null, rotation = null, durationMillis = null;
if (isImage()) { if (isImage()) {
@ -180,6 +181,7 @@ public class SourceImageEntry {
retriever.release(); retriever.release();
} }
} }
}
// expects entry with: uri, mimeType // expects entry with: uri, mimeType
// finds: width, height, orientation, date // finds: width, height, orientation, date

View file

@ -460,7 +460,8 @@ public class StorageUtils {
} }
retriever.setDataSource(context, uri); retriever.setDataSource(context, uri);
} catch (Exception e) { } catch (Exception e) {
Log.e(LOG_TAG, "failed to open MediaMetadataRetriever for uri=" + uri, e); // unsupported format
return null;
} }
return retriever; return retriever;
} }