2014-08-27 17 views
10

Próbuję napisać długie i inne dane do nagłówka Exif pliku jpeg w mojej niestandardowej aplikacji aparatu. Zazwyczaj android automatycznie wypełnia nagłówek danymi, takimi jak przysłona, ISO, czas otwarcia migawki itp. Jednak, gdy ręcznie dodaję instancję ExifInterface, ustaw lokalizację GPS na SetAttributes() i zadzwoń pod numer SaveAttributes(); wszystkie inne dane kamery znikają.Android ExifInterface saveAttributes() bez nadpisywania poprzednich danych?

Czy to ma się stać? Jak mogę po prostu dodać tag bez nadpisywania wszystkiego?

Widziałem przykład gdzie indziej tworzenia dwóch ExifInterfaces, stare (z obrazu) i nowe, i kopiowanie każdej zaludnionej wartości ze starego na nowy wraz z innymi danymi. Jest to jednak denerwujące i długotrwałe. Chciałbym znaleźć lepsze rozwiązanie.

Oto mój kod:

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(); 
} 

Dzięki

+0

Nie jestem pewien, dlaczego tak się dzieje. Próbowałem tej samej metody, którą wymieniłeś i żadne z moich danych EXIF ​​nie zostało zastąpione. Tylko moja lokalizacja GPS jest modyfikowana po zapisaniu atrybutów. Przetestowano na następujących urządzeniach, Nexus Prime - 4.2.1 Motorola Moto E - 4.4.4 –

Odpowiedz

0

Z dokumentacji widziałem to to nie powinno się zdarzyć. 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 

wyraźnie mówi, że to kopiowanie WSZYSTKIE dane, łącznie z tym, co mówisz, jest zanikający. Czy mógłbyś opublikować to, na czym to testujesz? Jeśli korzystasz z Android Studio możesz wypróbować Plik -> Unieważnij pamięć podręczną/Uruchom ponownie -> Unieważnij i uruchom ponownie.

Alternatywnie znalazłem odpowiedzi na podobne pytanie o utratę danych tutaj: https://stackoverflow.com/a/13784057/3585278

Jak wykazały inne, należy skopiować dane EXIF ​​z oryginalnym obrazem do ostatecznego zmienionym rozmiarze. Biblioteka Sanselan Android jest zwykle najlepsza do tego. W zależności od wersji systemu operacyjnego Android, , ExifInterface czasami psuje dane EXIF. Ponadto, interfejs ExifInterface obsługuje również ograniczoną liczbę tagów Exif - mianowicie tylko te znaczniki, o których "wie". Z drugiej strony Sanselan będzie przechowywać wszystkie znaczniki EXIF ​​i znaczniki. Oto blog, który pokazuje, jak używać Sanselan do kopiowania danych obrazu: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/ BTW, w Androidzie mam tendencję do obracania obrazów i usuwania tagu Orientacja EXIF. Na przykład na Nexusie S z Androidem 4.03 kamera ustawiała znacznik orientacji w metadanych EXIF, ale widok internetowy ignorował te informacje i wyświetlał niepoprawnie obraz. Niestety, obracanie rzeczywistych danych obrazu i usunięcie znacznika orientacji EXIF ​​ jest jedynym sposobem, aby każdy program prawidłowo wyświetlił obrazy .

Mam nadzieję, że to pomoże.

Powiązane problemy