在循环中调用ExifInterface导致java.lang.StackOverflowError

时间:2017-04-06 05:51:39

标签: android image-processing stack-overflow

我正在研究需要为所有摄像机图像调用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)

任何想法我怎么能阻止这个?

1 个答案:

答案 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);
   }
}