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

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

يمكن استرداد البيانات الوصفية للوسائط أثناء التشغيل بطرق متعددة. تشير رسالة الأشكال البيانية الأكثر وضوحًا هو الاستماع إلى حدث واحد (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);
    }
  }
}