复制exif标签时出现Android NullPointerException

时间:2011-07-25 07:02:19

标签: android image bitmap nullpointerexception exif

我正在尝试重新调整图像大小,该部分已完成。 然后我试图将exif标签复制到新文件。 我使用ExifInterface来读取标签。 我知道这是一个界面而不是一个对象。 但是当我尝试将它用于真正大尺寸的图像时,我得到了NullPointerException。 我得到的错误不是所有的图像。

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


在oldexif上调试监视 enter image description here


在newexif上调试监视 enter image description here


测试图像

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


为sdk 2.1使用Android模拟器

2 个答案:

答案 0 :(得分:3)

您正在saveAttributes中的某处传递空值。

调试NullPointerExceptions非常简单,只要你有源代码。

您可以在下面找到适用于Android 2.1的ExifInterface的源代码

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() + " ");

这里唯一可以为null的是val。 (您在saveAttributes方法中传递的值之一)。

我建议仔细检查你传递给该值的值,并注意空值。

答案 1 :(得分:0)

复制EXIF数据的更好方法是使用Sanselan Android库。 ExifInterface在某些版本上存在数据损坏错误,并且还处理有限数量的EXIF标记。

以下是关于使用Sanselan复制EXIF数据并提供示例代码的博客文章: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/