2017-04-06 3 views
1

Ich arbeite an etwas, das ExifInterface für alle Kamerabilder aufrufen muss, um Bilder Ort und Zeit zu erhalten, es funktioniert gut für die meisten Geräte, aber verursacht java.lang .StackOverflowError in einigen Geräten wie Redmi 3S.Aufruf von ExifInterface in einer Schleife verursacht java.lang.StackOverflowError

Was ich mache, ist so etwas.

for (String imagePath : paths) { 
     ExifInterface exif = new ExifInterface(imagePath); 
     float[] latlng = new float[2]; 
     if(exif.getLatLong(latlng)){ 
     //====rest of the process happened here. 
     } 
} 

das ist 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) 

Jede Idee, wie kann ich das verhindern?

+0

lesen https://examples.javacodegeeks.com/java-basics/exceptions/java-lang-stackoverflowerror-how-to-solve- stackoverflowerror/ –

+0

bieten einen stacktrace –

+0

@VladMatvienko Aktualisiert – Ankit

Antwort

0

Unsere App haben auch dieses Problem, indem Sie folgenden Code konfrontiert:

ExifInterface exif = new ExifInterface(f.getAbsolutePath()); 
int exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 

facebook Projekt „fresco“ auch vor dem gleichen Problem, https://github.com/facebook/fresco/issues/1661

Ich denke, diese Fehler gerätespezifisch und Bild spezifisch ist, Bild muss groß sein, um dies zu reproduzieren, und passiert in Android ExifInterface selbst, können wir nicht viel hier tun, vielleicht Android SDK wird dieses Problem eines Tages beheben.

Ich schlage vor, nur Lösung verwenden Abhilfe Um dieses Problem zu überwinden,

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); 
    } 
} 
Verwandte Themen