From a113a075ca9afa14361806ea592c8f078b1636c5 Mon Sep 17 00:00:00 2001 From: Oscar Rydhe Date: Fri, 14 Jan 2011 09:23:48 +0100 Subject: 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. bug:3381761 Change-Id: I864843c7fc699fe81e6acba801fe46d10a01925b --- media/java/android/media/ExifInterface.java | 32 +++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 11e27a90cc3e..925f965d6236 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -299,12 +299,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; } /** @@ -373,12 +377,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()) @@ -389,10 +393,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(); } } -- cgit v1.2.3-59-g8ed1b