diff options
author | Angus Kong <shkong@google.com> | 2013-08-14 10:52:40 -0700 |
---|---|---|
committer | Angus Kong <shkong@google.com> | 2013-08-14 13:26:50 -0700 |
commit | 0989e394420705b66867a8c1cf273b5904c8e4eb (patch) | |
tree | d316784c4f01986c027de95cb775ee9f1e3cbbc3 /src/com/android/camera/data/LocalMediaData.java | |
parent | a34e8c7d439d17355df51e5e536bdbbd1744cc74 (diff) | |
download | android_packages_apps_Snap-0989e394420705b66867a8c1cf273b5904c8e4eb.tar.gz android_packages_apps_Snap-0989e394420705b66867a8c1cf273b5904c8e4eb.tar.bz2 android_packages_apps_Snap-0989e394420705b66867a8c1cf273b5904c8e4eb.zip |
Handle unexpected exceptions when loading videos.
bug:10313671
bug:9757517
Change-Id: I8cb922599c4185a585f90007c3975841d14e179a
Diffstat (limited to 'src/com/android/camera/data/LocalMediaData.java')
-rw-r--r-- | src/com/android/camera/data/LocalMediaData.java | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/src/com/android/camera/data/LocalMediaData.java b/src/com/android/camera/data/LocalMediaData.java index 05b907a1e..d5a929d36 100644 --- a/src/com/android/camera/data/LocalMediaData.java +++ b/src/com/android/camera/data/LocalMediaData.java @@ -443,16 +443,26 @@ public abstract class LocalMediaData implements LocalData { d.height = c.getInt(COL_HEIGHT); d.mPlayUri = d.getContentUri(); MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(d.path); - String rotation = retriever.extractMetadata( + String rotation = null; + try { + retriever.setDataSource(d.path); + } catch (IllegalArgumentException ex) { + retriever.release(); + Log.e(TAG, "MediaMetadataRetriever.setDataSource() fail:" + + ex.getMessage()); + return null; + } + rotation = retriever.extractMetadata( MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); if (d.width == 0 || d.height == 0) { - d.width = Integer.parseInt(retriever.extractMetadata( - MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)); - d.height = Integer.parseInt(retriever.extractMetadata( - MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)); + retrieveVideoDimension(retriever, d); } retriever.release(); + if (d.width == 0 || d.height == 0) { + // Width or height is still not available. + Log.e(TAG, "Unable to retrieve dimension of video:" + d.path); + return null; + } if (rotation != null && (rotation.equals("90") || rotation.equals("270"))) { int b = d.width; @@ -509,6 +519,9 @@ public abstract class LocalMediaData implements LocalData { return false; } VideoData newData = buildFromCursor(c); + if (newData == null) { + return false; + } id = newData.id; title = newData.title; mimeType = newData.mimeType; @@ -587,6 +600,22 @@ public abstract class LocalMediaData implements LocalData { return bitmap; } } + + /** + * Extracts video height/width if available. If + * unavailable, set to 0. + * @param retriever An initialized metadata retriever. + * @param d The {@link VideoData} whose width/height are to update. + */ + private static void retrieveVideoDimension( + MediaMetadataRetriever retriever, VideoData d) { + String val = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); + d.width = (val == null) ? 0 : Integer.parseInt(val); + val = retriever.extractMetadata( + MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); + d.height = (val == null) ? 0 : Integer.parseInt(val); + } } /** |