summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/data
diff options
context:
space:
mode:
authorAngus Kong <shkong@google.com>2013-08-14 10:52:40 -0700
committerAngus Kong <shkong@google.com>2013-08-14 13:26:50 -0700
commit0989e394420705b66867a8c1cf273b5904c8e4eb (patch)
treed316784c4f01986c027de95cb775ee9f1e3cbbc3 /src/com/android/camera/data
parenta34e8c7d439d17355df51e5e536bdbbd1744cc74 (diff)
downloadandroid_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')
-rw-r--r--src/com/android/camera/data/LocalMediaData.java41
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);
+ }
}
/**