2015-01-01 10 views
11

Próbuję napisać User_Comment i TAG_GPS do przechwyconego obrazu w aplikacji dla systemu Android przy użyciu interfejsu exif, ale z jakiegoś powodu znaczniki nie wydają się być dołączane do obrazu po wyświetleniu szczegółów obrazu w galerii .Jak zapisywać dane exif do obrazu w systemie Android?

Wygląda na to, że znaczniki nie są zapisywane na przechwyconym obrazie, ponieważ ścieżka do pliku może być niepoprawna. Myślę, że to możliwe, ponieważ napisałem tagi do niewłaściwej ścieżki obrazu.

Czy ktoś wie, czy jest to problem ze sposobem, w jaki piszę tagi do obrazu?

Jest to kod, który zapisuje dane EXIF ​​następujące @ zmian Charliego poniżej:

private File getOutputPhotoFile() throws IOException { 
      File directory = new File(Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES), getPackageName()); 
      if (!directory.exists()) { 
      if (!directory.mkdirs()) { 
       Log.e(TAG, "Failed to create storage directory."); 
       return null; 
      } 
      } 


      String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.ENGLISH).format(new Date()); 

      File[] files = directory.listFiles(); 

      File exifVar = new File(directory.getPath(), "IMG_" + timeStamp + ".jpg"); 
      if(files.length!=0) { 
       File newestFile = files[files.length-1]; 
       exifVar = new File(directory.getPath() + File.separator + newestFile.getName()); 
      } 

      String mString = "Generic Text..";  
      ExifInterface exif = new ExifInterface(exifVar.getAbsolutePath()); 
      exif.setAttribute("UserComment", mString); 
      exif.saveAttributes(); 


      exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, 
      String.valueOf(latituteField.toString())); 

      exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, 
      String.valueOf(longitudeField.toString())); 

      exif.saveAttributes(); 

      return exifVar; 




    } 
+0

dlaczego często wywołujesz exif.saveAttributes? Uważam, że za każdym razem tworzy nowy obraz. Zastanawiam się, – wkhatch

+0

Jest to możliwe, nie pracowałem nad tym projektem od jakiegoś czasu, myślę, że problem mógł być, że dane są zapisywane do obrazu tymczasowego o nazwie "exif" i nigdy nie są zapisywane na oryginalnym obrazie. –

Odpowiedz

3

Używasz exifVar.toString(). To zwraca tylko nazwę pliku, a nie ścieżkę do obrazu. Ponieważ Twoja aplikacja prawdopodobnie nie znajduje się w folderze ze zdjęciami, powinieneś użyć exifVar.getAbsolutePath().

Jeśli nie robisz zdjęcia w tym samym czasie, w którym uruchamiasz program, Ścieżka nie będzie właściwa. Użyj tego kodu:

File[] files = directory.listFiles(); 

if(files.length==0) { 
    // No images available 
    return; 
} 

File newestFile = files[files.length-1]; 

File exifVar = new File(directory.getPath() + File.separator + newestFile.getName()); 

Off-Topic:

Według swojej ogromnej liście importowej:

import android.content.*; 

importu

android.content.Context, 
android.content.DialogInterface and 
android.content.Intent 

To sprawia, że ​​Twój kod trochę krótsza . Po prostu mówiąc

+0

Dane exif wciąż nie są dodawane do szczegółów obrazu po powyższych zmianach, czy masz jakieś pomysły? –

3

Musisz najpierw skopiować pliki znajdujące się tutaj google exif exif do projektu, a następnie użyć następującego kodu:

ExifInterface exif = new ExifInterface(); 
exifi.readExif(exifVar.getAbsolutePath()); 
exif.setTagValue(ExifInterface.TAG_USER_COMMENT, mString); 
exif.forceRewriteExif(exifVar.getAbsolutePath())); 

ExifInterface wykorzystywane Oto nowa właśnie dodany.

+0

Byłoby lepiej, gdybyś mógł określić typ danych i inicjalizację zmiennej "exifi" – Deva

Powiązane problemy