leitor exif de imagem android API de terceiros
Pergunta
Existe alguma API de terceira parte para Android para ler tags exif da imagem que suporta o nível de API a partir de 1.5.
Solução
O biblioteca de extração de metadados de Drew Noakes funciona bem para extrair tags EXIF em versões anteriores da plataforma Android, com uma ligeira modificação.Estou usando no Android 1.6 para extrair tags de imagens JPEG.
OBSERVAÇÃO:Versões mais recentes de extrator de metadados trabalhe diretamente no Android sem modificação.
Você vai precisar download e crie você mesmo o código-fonte e empacote-o com seu aplicativo.(Estou usando a versão 2.3.1.) Faça as seguintes alterações em com.drew.imaging.jpeg.JpegMetadataReader
:
Remova a seguinte instrução de importação:
import com.sun.image.codec.jpeg.JPEGDecodeParam;
Exclua o seguinte método (que você não precisará no Android):
public static Metadata readMetadata(JPEGDecodeParam decodeParam) { ... }
Remova o com.drew.metadata.SampleUsage
class, que faz referência ao método excluído acima.Remova também todos os pacotes de teste.
Isso é tudo que há para fazer.Aqui está um exemplo de uso do JpegMetadataReader
para extrair uma etiqueta de data e hora de uma imagem JPEG armazenada no cartão SD:
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;
}
Outras dicas
Pelo que vale, você tentou usar a classe ExifInterface nativa?
http://developer.android.com/reference/android/media/ExifInterface.html
Deve ser mais rápido do que usar uma biblioteca de terceiros;)