سؤال

هل هناك أي واجهة برمجة تطبيقات الجزء الثالث لنظام 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:

getresourceasstream

أولا تحتاج أولا للتأكد من أن المورد موجود في الجرة (افتحه وتأكد من وجوده)، واثنين تأكد من استدعاء API مثل ذلك وليس ملف IO (لأن الصورة سوفيكون في الجرة؛ ليس على نظام الملفات).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top