2014-08-27 15 views
10

Ich versuche, lat-long und andere Daten in den Exif-Header eines JPEG in meiner benutzerdefinierten Kamera-App zu schreiben. Normalerweise füllt Android die Kopfzeile automatisch mit Daten wie Blende, ISO, Verschlusszeit usw. Wenn ich jedoch manuell eine ExifInterface Instanz anlege, stelle den GPS-Standort mit SetAttributes() ein und rufe SaveAttributes() an; Alle anderen Kameradaten verschwinden.Android ExifInterface saveAttributes() Ohne vorherige Daten überschreiben?

Soll das passieren? Wie kann ich einfach ein Tag hinzufügen, ohne alles andere zu überschreiben?

Ich sah ein Beispiel woanders zwei ExifInterfaces erstellen, ein altes (aus dem Bild) und ein neues, und jeden bevölkerten Wert vom alten zum neuen zusammen mit irgendwelchen anderen Daten kopieren. Dies ist jedoch ärgerlich und langwierig. Ich würde gerne eine bessere Lösung finden.

Hier ist mein Code:

try{ 
    ExifInterface exif = new ExifInterface(pictureFile.getAbsolutePath()); 
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, mGpsLocation.getLatDms()); 
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, mGpsLocation.getLonDms()); 
    exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, mGpsLocation.getAltDms()); 
    exif.saveAttributes(); 
} catch(IOException e){ 
    e.printStackTrace(); 
} 

Dank

+0

Ich bin nicht sicher, warum das bei Ihnen passiert. Ich habe die gleiche Methode versucht, die Sie erwähnt haben, und keiner meiner EXIF-Daten wird überschrieben. Nur meine GPS-Position wird nach dem Speichern von Attributen geändert. Getestet an folgenden Geräten: Nexus Prime - 4.2.1 Motorola Moto E - 4.4.4 –

Antwort

0

Aus der Dokumentation ich das gesehen habe, dies nicht geschehen sollte. http://developer.android.com/reference/android/media/ExifInterface.html

public void saveAttributes() 

Added in API level 5 
Save the tag data into the JPEG file. This is expensive because it involves copying all the JPG data from one file to another and deleting the old file and renaming the other. It's best to use setAttribute(String, String) to set all attributes to write and make a single call rather than multiple calls for each attribute. 

Throws 
IOException 

Er sagt klar, dass es ALLE die Daten kopiert hat, auch die Dinge, die Sie sagen, verschwindet. Könnten Sie vielleicht posten, was Sie gerade testen? Wenn Sie in Android Studio sind, können Sie versuchen, Datei -> Caches ungültig zu machen/Neustart -> Invalidate und Restart.

Alternativ fand ich eine Antwort auf eine ähnliche Frage über die Daten hier zu verlieren: https://stackoverflow.com/a/13784057/3585278

Wie andere schon angedeutet haben, können Sie die EXIF-Daten aus dem Originalbild auf das endgültige Größe geänderte Bild kopieren. Die Sanselan Android Bibliothek ist in der Regel am besten dafür geeignet. Abhängig von der Android OS-Version, , beschädigt das ExifInterface manchmal die EXIF-Daten. Darüber hinaus verarbeitet das ExifInterface auch eine begrenzte Anzahl von Exif-Tags - nämlich nur die Tags, über die es "weiß". Sanselan auf der anderen Seite wird behalten alle EXIF-Tags und Marker Notes. Hier ist ein Blog-Beitrag, der zeigt, wie man Sanselan zum Kopieren von Bilddaten verwendet: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/ BTW, auf Android tendiere ich auch dazu, die Bilder zu drehen und das Orientation EXIF-Tag zu entfernen. Bei einem Nexus S mit Android 4.03 beispielsweise wurde von der Kamera ein Ausrichtungskennzeichen in den EXIF-Metadaten festgelegt, aber die Webansicht ignorierte diese Informationen und zeigte das Bild falsch an. Leider ist das Drehen der aktuellen Bilddaten und das Entfernen des EXIF ​​ Orientierungs-Tags die einzige Möglichkeit, jedes Programm dazu zu bringen, Bilder korrekt anzuzeigen.

Ich hoffe, das hilft.

Verwandte Themen