5

Is there any 3rd part api for android to read exif tags from image which support api level starting from 1.5.

d-man
  • 57,473
  • 85
  • 212
  • 296

2 Answers2

9

The metadata extraction library by Drew Noakes works well for extracting EXIF tags on earlier Android platform versions, with a slight modification. I am using it on Android 1.6 to extract tags from JPEG images.

NOTE: Newer versions of metadata-extractor work directly on Android without modification.

You will need to download and build the source code yourself, and package it with your app. (I'm using release 2.3.1.) Make the following changes to com.drew.imaging.jpeg.JpegMetadataReader:

  • Remove the following import statement:

    import com.sun.image.codec.jpeg.JPEGDecodeParam;

  • Delete the following method (which you won't need on Android):

    public static Metadata readMetadata(JPEGDecodeParam decodeParam) { ... }

Remove the com.drew.metadata.SampleUsage class, which references the method deleted above. Also remove all of the test packages.

That's all there is to it. Here's an example of using the JpegMetadataReader to extract a date-time tag from a JPEG image stored on the SD card:

import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifDirectory;

// other imports and class definition removed for brevity

public static Date extractExifDateTime(String imagePath)
{
    Log.d("exif", "Attempting to extract EXIF date/time from image at " + imagePath);
    Date datetime = new Date(0); // or initialize to null, if you prefer
    try
    {
        Metadata metadata = JpegMetadataReader.readMetadata(new File(imagePath));
        Directory exifDirectory = metadata.getDirectory(ExifDirectory.class);

        // these are listed in order of preference
        int[] datetimeTags = new int[] { ExifDirectory.TAG_DATETIME_ORIGINAL,
                                         ExifDirectory.TAG_DATETIME,
                                         ExifDirectory.TAG_DATETIME_DIGITIZED };
        int datetimeTag = -1;
        for (int tag : datetimeTags)
        {
            if (exifDirectory.containsTag(tag))
            {
                datetimeTag = tag;
                break;
            }
        }

        if (datetimeTag != -1)
        {
            Log.d("exif", "Using tag " + exifDirectory.getTagName(datetimeTag) + " for timestamp");

            SimpleDateFormat exifDatetimeFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
            datetime = exifDatetimeFormat.parse(exifDirectory.getString(datetimeTag));
        }
        else
        {
            Log.d("exif", "No date/time tags were found");
        }
    }
    catch (Exception e)
    {
        Log.w("exif", "Unable to extract EXIF metadata from image at " + imagePath, e);
    }
    return datetime;
}
Drew Noakes
  • 300,895
  • 165
  • 679
  • 742
Steve
  • 684
  • 7
  • 8
  • want to add this jar into my project but it contain some sun files also as in android they dont have sun files whenever i am trying to add these libraries and going to use this line of code Metadata metadata = JpegMetadataReader.readMetadata(new File(imagePath)); it need to configure my path coz this jar contain some sun classes also. any suggestion – PiyushMishra Jul 24 '11 at 14:50
  • 2
    This ain't seem to be necessary w/ current version 2.8.1 – m02ph3u5 Apr 29 '15 at 12:46
1

For what it worth, did you try to use the native ExifInterface class ?

http://developer.android.com/reference/android/media/ExifInterface.html

Should be must faster than using a 3rd party library ;)

Spredzy
  • 4,982
  • 13
  • 53
  • 69
  • 5
    The question specifically asks for how to do this from Android 1.5 and up. The ExifInterface was introduced in Android 2.0 (API level 5). For 2.0 and higher, then the ExifInterface class should work. – Steve May 16 '10 at 12:23
  • and was disappointed to know that certain tags like EXPOSURE_TIME is available only after API level 11. – sat Apr 14 '11 at 06:06
  • Further, the built-in one does not seem to support everything (like GPSImgDirection). – Phoebe Feb 26 '15 at 19:16