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