我遇到了Android 10无法从我的jpeg文件读取GPS信息的问题。完全相同的文件在Android 9上运行。我尝试了返回空值的ExifInterface(androidx),以及说“ GPSLatitude:无效有理数(0/0),无效有理数(0/0)”的apache commons成像。其他exif信息(如等级或XPKeywords)已正确读取。
如何解决?
测试代码:
import androidx.exifinterface.media.ExifInterface;
ExifInterface exif2 = new ExifInterface(is);
double[] latLngArray = exif2.getLatLong();
getLatLong实现:
public double[] getLatLong() {
String latValue = getAttribute(TAG_GPS_LATITUDE);
String latRef = getAttribute(TAG_GPS_LATITUDE_REF);
String lngValue = getAttribute(TAG_GPS_LONGITUDE);
String lngRef = getAttribute(TAG_GPS_LONGITUDE_REF);
if (latValue != null && latRef != null && lngValue != null && lngRef != null) {
try {
double latitude = convertRationalLatLonToDouble(latValue, latRef);
double longitude = convertRationalLatLonToDouble(lngValue, lngRef);
return new double[] {latitude, longitude};
} catch (IllegalArgumentException e) {
Log.w(TAG, "Latitude/longitude values are not parseable. " +
String.format("latValue=%s, latRef=%s, lngValue=%s, lngRef=%s",
latValue, latRef, lngValue, lngRef));
}
}
return null;
}
所有getAttribute调用在Android Q / 10上都返回null。在Android 9上,它可以正常工作。我的测试照片确实包含GPS信息。甚至Android本身也无法将GPS位置索引到其媒体存储中。该字段在其数据库中也为null。我通过邮件转移了测试照片。
如in developer android所述,现在,在Android 10上,图像文件上嵌入的位置无法直接用于应用程序:
因为此位置信息敏感,但是,如果Android 10使用范围存储,则默认情况下Android 10会从您的应用程序中隐藏此信息。
在同一链接上,您可以检查如何解决:
在您应用的清单中请求ACCESS_MEDIA_LOCATION
权限。
从MediaStore对象中,调用setRequireOriginal()
,并传递照片的URI,如以下代码片段所示:
代码段:
Uri photoUri = Uri.withAppendedPath(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
cursor.getString(idColumnIndex));
// Get location data from the ExifInterface class.
photoUri = MediaStore.setRequireOriginal(photoUri);
InputStream stream = getContentResolver().openInputStream(photoUri);
if (stream != null) {
ExifInterface exifInterface = new ExifInterface(stream);
// Don't reuse the stream associated with the instance of "ExifInterface".
stream.close();
} else {
// Failed to load the stream, so return the coordinates (0, 0).
latLong = new double[2];
}
请注意,由于它们现在如何使用Uri
,InputStream
(以及FileDescriptor
)来访问文件,因此您无法使用其文件路径访问文件。