在Android Q / 10上无法读取ExifInterface GPS

时间:2019-09-17 19:33:46

标签: android exif androidx android-10.0 android-exifinterface

我遇到了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。我通过邮件转移了测试照片。

1 个答案:

答案 0 :(得分:4)

in developer android所述,现在,在Android 10上,嵌入图像文件的位置不适用于应用程序:

  

因为此位置信息敏感,但是,如果Android 10使用范围存储,则默认情况下Android 10会从您的应用中隐藏此信息。

在同一链接上,您可以检查如何解决:

  1. 在应用清单中请求<button onclick="toggle()">Toggle</button> <div class="image-container"> <img onmousemove="move(event)" src="http://lorempixel.com/300/200" /> <div class="after"> </div> </div>权限。

  2. 从MediaStore对象中,调用ACCESS_MEDIA_LOCATION,传入照片的URI,如以下代码片段所示:

代码段:

setRequireOriginal()

请注意,自从现在以来,他们现在如何使用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)访问文件,您无法使用文件路径访问文件。