2011-07-25 53 views
2

我試圖重新調整大小的圖像,該部分完成。 然後我試圖將exif標籤複製到新文件中。 我使用ExifInterface來讀取標籤。 我知道這是一個界面,而不是一個對象。 但是當我嘗試使用它來拍攝真正大尺寸的圖像時,我得到了NullPointerException。 我得到這個錯誤不是所有的圖像。Android NullPointerException異常複製exif標記

07-25 11:59:23.870: WARN/System.err(1362): java.lang.NullPointerException 
07-25 11:59:23.870: WARN/System.err(1362):  at android.media.ExifInterface.saveAttributes(ExifInterface.java:202) 

我該如何解決?

代碼複製EXIF信息

try { 
    // copy paste exif information from original file to new 
    // file 
    ExifInterface oldexif = new ExifInterface(filePath); 
    ExifInterface newexif = new ExifInterface(file.getPath()); 

    int build = Build.VERSION.SDK_INT; 

    // From API 11 
    if (build >= 11) { 
     newexif.setAttribute("FNumber", 
       oldexif.getAttribute("FNumber")); 
     newexif.setAttribute("ExposureTime", 
       oldexif.getAttribute("ExposureTime")); 
     newexif.setAttribute("ISOSpeedRatings", 
       oldexif.getAttribute("ISOSpeedRatings")); 
    } 
    // From API 9 
    if (build >= 9) { 
     newexif.setAttribute("GPSAltitude", 
       oldexif.getAttribute("GPSAltitude")); 
     newexif.setAttribute("GPSAltitudeRef", 
       oldexif.getAttribute("GPSAltitudeRef")); 
    } 
    // From API 8 
    if (build >= 8) { 
     newexif.setAttribute("FocalLength", 
       oldexif.getAttribute("FocalLength")); 
     newexif.setAttribute("GPSDateStamp", 
       oldexif.getAttribute("GPSDateStamp")); 
     newexif.setAttribute("GPSProcessingMethod", 
       oldexif.getAttribute("GPSProcessingMethod")); 
     newexif.setAttribute("GPSTimeStamp", 
       oldexif.getAttribute("GPSTimeStamp")); 
    } 
    newexif.setAttribute("DateTime", 
      oldexif.getAttribute("DateTime")); 
    newexif.setAttribute("Flash", oldexif.getAttribute("Flash")); 
    newexif.setAttribute("GPSLatitude", 
      oldexif.getAttribute("GPSLatitude")); 
    newexif.setAttribute("GPSLatitudeRef", 
      oldexif.getAttribute("GPSLatitudeRef")); 
    newexif.setAttribute("GPSLongitude", 
      oldexif.getAttribute("GPSLongitude")); 
    newexif.setAttribute("GPSLongitudeRef", 
      oldexif.getAttribute("GPSLongitudeRef")); 

    // You need to update this with your new height width 
    newexif.setAttribute("ImageLength", 
      oldexif.getAttribute("ImageLength")); 
    newexif.setAttribute("ImageWidth", 
      oldexif.getAttribute("ImageWidth")); 

    newexif.setAttribute("Make", oldexif.getAttribute("Make")); 
    newexif.setAttribute("Model", oldexif.getAttribute("Model")); 
    newexif.setAttribute("Orientation", 
      oldexif.getAttribute("Orientation")); 
    newexif.setAttribute("WhiteBalance", 
      oldexif.getAttribute("WhiteBalance")); 

    newexif.saveAttributes(); 

    Toast.makeText(getApplicationContext(), 
      "Image resized & saved successfully", 
      Toast.LENGTH_SHORT).show(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

附加onFly信息:

創建

新文件時,我試圖同時讀取文件: enter image description here


調試手錶on oldexif enter image description here


調試觀看newexif enter image description here


測試圖像

http://vikaskanani.files.wordpress.com/2011/07/test.jpg


使用Android模擬器的SDK 2.1

+0

你上岸,所有的圖像都功能標籤?因爲它似乎是一些沒有標籤。在catch上嘗試打印文件的名稱,看看是否有問題。 – PedroAGSantos

回答

3

您傳遞在saveAttributes的某個地方使用空值。

調試NullPointerExceptions非常簡單,只要您有源代碼即可。

下面你可以找到的ExifInterface的源代碼的Android 2.1

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/media/ExifInterface.java#ExifInterface

線202包含這樣的:可以爲空在這裏

sb.append(val.length() + " "); 

唯一的事情是Val。 (您在saveAttributes方法中傳遞的值之一)。

我會建議仔細檢查您傳遞到該值的值,並注意空值。

+0

是的,直到今天,我還認爲這個錯誤很容易解決。但今天,我對界面感到困惑。在設置屬性時,String參數不能爲空,因此只需添加「」就足夠了! – Vikas

+1

Google代碼理想情況下應拋出IllegalArgumentException或其他內容,指示哪些屬性爲null。本來更容易調試。 – ddewaele

0

複製EXIF數據的更好方法是使用Sanselan Android庫。 ExifInterface在某些版本上存在數據損壞錯誤,並且還處理數量有限的EXIF標籤。

這裏是博客貼子,討論如何使用Sanselan複製EXIF數據,並提供了示例代碼: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/

+0

太棒了!在我的情況下,我只處理經度和緯度! – Vikas

相關問題