我正在研究需要为所有摄像机图像调用ExifInterface以获取图像位置和时间的东西,它适用于大多数设备,但它在某些设备中导致java.lang.StackOverflowError,如 Redmi 3S
我正在做的是这样的事情。
for (String imagePath : paths) {
ExifInterface exif = new ExifInterface(imagePath);
float[] latlng = new float[2];
if(exif.getLatLong(latlng)){
//====rest of the process happened here.
}
}
这是stacktrace
Fatal Exception: java.lang.StackOverflowError: stack size 1038KB
at java.lang.Integer.valueOf(Integer.java:742)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:1940)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2041)
at android.media.ExifInterface.readImageFileDirectory(ExifInterface.java:2014)
at android.media.ExifInterface.readExifSegment(ExifInterface.java:1863)
at android.media.ExifInterface.getJpegAttributes(ExifInterface.java:1662)
at android.media.ExifInterface.loadAttributes(ExifInterface.java:1339)
at android.media.ExifInterface.(ExifInterface.java)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
任何想法我怎么能阻止这个?
答案 0 :(得分:0)
我们的应用也遇到了这个问题,请遵循以下代码:
ExifInterface exif = new ExifInterface(f.getAbsolutePath());
int exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
facebook项目“fresco”也面临同样的问题,https://github.com/facebook/fresco/issues/1661
我认为这个错误是设备特定的和图像特定的,图像需要很大才能重现这个,并且发生在Android的ExifInterface本身,我们在这里做不了多少,也许android sdk有一天会解决这个问题。
我建议只使用变通方法解决此问题,
public static ExifInterface get(String path) throws IOException {
try {
return new ExifInterface(path);
} catch (RuntimeException | StackOverflowError ex) {
// Internal error in Android's EXIF API.
Log.w(FX.LOG_TAG, "Android failed to perform EXIF analysis on image: " + path + ";\n" + ex);
throw new IOException(ex);
}
}