diff options
author | Oscar Rydhe <oscar.rydhe@sonyericsson.com> | 2011-01-14 09:23:48 +0100 |
---|---|---|
committer | Johan Redestig <johan.redestig@sonyericsson.com> | 2011-01-17 09:59:35 +0100 |
commit | 0208c0ab439a2118c1e2af5473fbb63c1336c368 (patch) | |
tree | 5aa637e71566104a3a53ab9a976323b3ed211014 | |
parent | 7d234fabe61cd5f034fe4ff4484209fbf5130c4d (diff) | |
download | frameworks_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.java | 32 |
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(); } } |