Android Image Exif Reader 3rd Party API
سؤال
هل هناك أي واجهة برمجة تطبيقات الجزء الثالث لنظام Android لقراءة علامات exif من الصورة التي تدعم مستوى API بدءًا من 1.5.
المحلول
ال مكتبة استخراج البيانات الوصفية بواسطة Drew Noakes يعمل بشكل جيد لاستخراج علامات exif على إصدارات منصة Android السابقة ، مع تعديل طفيف. أنا أستخدمه على Android 1.6 لاستخراج العلامات من صور JPEG.
ملاحظة: إصدارات أحدث من بيانات التعريف العمل مباشرة على Android دون تعديل.
سوف تحتاج إلى تحميل وقم ببناء الكود المصدر بنفسك ، وقم بتعبئته باستخدام تطبيقك. (أنا أستخدم الإصدار 2.3.1.) قم بإجراء التغييرات التالية على com.drew.imaging.jpeg.JpegMetadataReader
:
قم بإزالة بيان الاستيراد التالي:
import com.sun.image.codec.jpeg.JPEGDecodeParam;
احذف الطريقة التالية (التي لن تحتاجها على Android):
public static Metadata readMetadata(JPEGDecodeParam decodeParam) { ... }
مسح ال com.drew.metadata.SampleUsage
الفئة ، والتي تشير إلى الطريقة المحذوفة أعلاه. أيضا إزالة جميع حزم الاختبار.
هذا كل ما في الامر. إليك مثال على استخدام JpegMetadataReader
لاستخراج علامة وقت التاريخ من صورة JPEG مخزنة على بطاقة 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;
}
نصائح أخرى
تريد تضمين المورد في الجدر نفسه، وقراءة الملف باستخدام هذا API:
أولا تحتاج أولا للتأكد من أن المورد موجود في الجرة (افتحه وتأكد من وجوده)، واثنين تأكد من استدعاء API مثل ذلك وليس ملف IO (لأن الصورة سوفيكون في الجرة؛ ليس على نظام الملفات).