summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOscar Rydhe <oscar.rydhe@sonyericsson.com>2011-01-14 09:23:48 +0100
committerJohan Redestig <johan.redestig@sonyericsson.com>2011-01-17 09:59:35 +0100
commit0208c0ab439a2118c1e2af5473fbb63c1336c368 (patch)
tree5aa637e71566104a3a53ab9a976323b3ed211014
parent7d234fabe61cd5f034fe4ff4484209fbf5130c4d (diff)
downloadframeworks_base-0208c0ab439a2118c1e2af5473fbb63c1336c368.zip
frameworks_base-0208c0ab439a2118c1e2af5473fbb63c1336c368.tar.gz
frameworks_base-0208c0ab439a2118c1e2af5473fbb63c1336c368.tar.bz2
Improved conversion accuracy of exif geotag data
Changed degrees and minutes of geotag data into double to avoid data loss during cast. Also improved error handling if geotag data can't be parsed. Change-Id: I864843c7fc699fe81e6acba801fe46d10a01925b
-rw-r--r--media/java/android/media/ExifInterface.java32
1 files changed, 19 insertions, 13 deletions
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 74488c5..a08f388 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -293,12 +293,16 @@ public class ExifInterface {
String lngRef = mAttributes.get(ExifInterface.TAG_GPS_LONGITUDE_REF);
if (latValue != null && latRef != null && lngValue != null && lngRef != null) {
- output[0] = convertRationalLatLonToFloat(latValue, latRef);
- output[1] = convertRationalLatLonToFloat(lngValue, lngRef);
- return true;
- } else {
- return false;
+ try {
+ output[0] = convertRationalLatLonToFloat(latValue, latRef);
+ output[1] = convertRationalLatLonToFloat(lngValue, lngRef);
+ return true;
+ } catch (IllegalArgumentException e) {
+ // if values are not parseable
+ }
}
+
+ return false;
}
/**
@@ -367,12 +371,12 @@ public class ExifInterface {
String [] pair;
pair = parts[0].split("/");
- int degrees = (int) (Float.parseFloat(pair[0].trim())
- / Float.parseFloat(pair[1].trim()));
+ double degrees = Double.parseDouble(pair[0].trim())
+ / Double.parseDouble(pair[1].trim());
pair = parts[1].split("/");
- int minutes = (int) ((Float.parseFloat(pair[0].trim())
- / Float.parseFloat(pair[1].trim())));
+ double minutes = Double.parseDouble(pair[0].trim())
+ / Double.parseDouble(pair[1].trim());
pair = parts[2].split("/");
double seconds = Double.parseDouble(pair[0].trim())
@@ -383,10 +387,12 @@ public class ExifInterface {
return (float) -result;
}
return (float) result;
- } catch (RuntimeException ex) {
- // if for whatever reason we can't parse the lat long then return
- // null
- return 0f;
+ } catch (NumberFormatException e) {
+ // Some of the nubmers are not valid
+ throw new IllegalArgumentException();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ // Some of the rational does not follow the correct format
+ throw new IllegalArgumentException();
}
}