جارٍ استرداد البيانات الوصفية

أثناء التشغيل

يمكن استرداد البيانات الوصفية للوسائط أثناء التشغيل بعدة طرق. إنّ الطريقة الأكثر وضوحًا هي الاستماع إلى حدث Player.Listener#onMediaMetadataChanged، وسيوفّر ذلك عنصر MediaMetadata لاستخدامه، والذي يحتوي على حقول مثل title و albumArtist. بدلاً من ذلك، يؤدي استدعاء Player#getMediaMetadata إلى عرض الكائن نفسه.

Kotlin

override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata.title?.let(::handleTitle)
}

Java

@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
  if (mediaMetadata.title != null) {
    handleTitle(mediaMetadata.title);
  }
}

إذا كان تطبيقك يحتاج إلى الوصول إلى عناصر Metadata.Entry معيّنة، يجب أن يستمع إلى Player.Listener#onMetadata (للبيانات الوصفية الديناميكية التي يتم إرسالها أثناء التشغيل). بدلاً من ذلك، إذا كنت بحاجة إلى الاطّلاع على البيانات الوصفية الثابتة، يمكنك الوصول إليها من خلال TrackSelections#getFormat. تتم تعبئة Player#getMediaMetadata من كلا المصدرَين.

بدون تشغيل

إذا لم تكن ميزة التشغيل مطلوبة، من الأفضل استخدام MetadataRetriever لاستخراج البيانات الوصفية لأنّ ذلك يتجنّب الحاجة إلى إنشاء مشغّل وإعداده.

Kotlin

val trackGroupsFuture = MetadataRetriever.retrieveMetadata(context, mediaItem)
Futures.addCallback(
  trackGroupsFuture,
  object : FutureCallback<TrackGroupArray?> {
    override fun onSuccess(trackGroups: TrackGroupArray?) {
      if (trackGroups != null) handleMetadata(trackGroups)
    }

    override fun onFailure(t: Throwable) {
      handleFailure(t)
    }
  },
  executor
)

Java

ListenableFuture<TrackGroupArray> trackGroupsFuture =
    MetadataRetriever.retrieveMetadata(context, mediaItem);
Futures.addCallback(
    trackGroupsFuture,
    new FutureCallback<TrackGroupArray>() {
      @Override
      public void onSuccess(TrackGroupArray trackGroups) {
        handleMetadata(trackGroups);
      }

      @Override
      public void onFailure(Throwable t) {
        handleFailure(t);
      }
    },
    executor);

الصور الحيّة

من الممكن أيضًا استخراج البيانات الوصفية للصور المتحركة، بما في ذلك المقاطع الزمنية و أطوال أجزاء الصورة والفيديو في الملف.

بالنسبة إلى الصور الحيّة، تمّ الحصول على TrackGroupArray من خلال MetadataRetriever. على TrackGroup مع Format واحد يشتمل على إدخال البيانات الوصفية لـ MotionPhotoMetadata

Kotlin

0.until(trackGroups.length)
  .asSequence()
  .mapNotNull { trackGroups[it].getFormat(0).metadata }
  .filter { metadata -> metadata.length() == 1 }
  .map { metadata -> metadata[0] }
  .filterIsInstance<MotionPhotoMetadata>()
  .forEach(::handleMotionPhotoMetadata)

Java

for (int i = 0; i < trackGroups.length; i++) {
  TrackGroup trackGroup = trackGroups.get(i);
  Metadata metadata = trackGroup.getFormat(0).metadata;
  if (metadata != null && metadata.length() == 1) {
    Metadata.Entry metadataEntry = metadata.get(0);
    if (metadataEntry instanceof MotionPhotoMetadata) {
      MotionPhotoMetadata motionPhotoMetadata = (MotionPhotoMetadata) metadataEntry;
      handleMotionPhotoMetadata(motionPhotoMetadata);
    }
  }
}