بعد استخدام عناصر قابلة للتصفّح أو للتشغيل من أجل [إنشاء تسلسل هرمي للمحتوى][1]، طبِّق أنماط المحتوى لتحديد طريقة عرض هذه العناصر في السيارة. استخدِم أنماط المحتوى التالية:
الشكل 1: تمنح عناصر القائمة الأولوية للعناوين والبيانات الوصفية على الصور.
الشكل 2: تمنح عناصر الشبكة الأولوية للصور على العناوين والبيانات الوصفية.
ضبط الأنماط التلقائية للمحتوى
يمكنك ضبط الإعدادات التلقائية العامة لطريقة عرض عناصر الوسائط. لإجراء ذلك،
أدرِج ثوابت محدّدة في حزمة البيانات الإضافية BrowserRoot التي يعرضها
تنفيذ [onGetRoot][1] لخدمتك، وابحث عن هذه الثوابت
لتحديد النمط المناسب.
يمكن استخدام هذه الإضافات كمفاتيح في الحزمة:
[
DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE][2]: تلميح عرض تقديمي لجميع العناصر القابلة للتصفّح ضمن شجرة التصفّح.[
DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE][3]: تلميح عرض تقديمي لجميع العناصر القابلة للتشغيل ضمن شجرة التصفّح.
يمكن ربط هذه المفاتيح بقيم ثابتة صحيحة للتأثير في طريقة عرض هذه العناصر:
[
DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM][4]: العناصر المطابقة المعروضة كعناصر قائمة[
DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM][5]: العناصر ذات الصلة المعروضة كمربّعات في شبكة[
DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM][6]: العناصر المقابلة المعروضة كعناصر قائمة "الفئة"، على غرار عناصر القائمة العادية، ولكن يتم تطبيق الهوامش حول رموز العناصر. ويؤدي ذلك إلى تحسين مظهر الرموز الصغيرة. يجب أن تكون الرموز رسومات متجهة قابلة للتلوين. قدِّم هذه التلميحة للعناصر القابلة للتصفّح فقط.[
DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM][7]: العناصر ذات الصلة المعروضة كعناصر شبكة "الفئة" تشبه عناصر الشبكة العادية، ولكن يتم تطبيق هوامش حول رموز العناصر. يؤدي ذلك إلى تحسين مظهر الرموز الصغيرة. يجب أن تكون الرموز رسومات متجهة قابلة للتلوين. قدِّم هذه التلميحة للعناصر القابلة للتصفّح فقط.
يوضّح مقتطف الرمز البرمجي التالي كيفية ضبط نمط المحتوى التلقائي للعناصر القابلة للتصفّح على شكل شبكات وللعناصر القابلة للتشغيل على شكل قوائم:
Kotlin
import androidx.media.utils.MediaConstants
@Nullable
override fun onGetRoot(
@NonNull clientPackageName: String,
clientUid: Int,
@Nullable rootHints: Bundle
): BrowserRoot {
val extras = Bundle()
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
return BrowserRoot(ROOT_ID, extras)
}
Java
import androidx.media.utils.MediaConstants;
@Nullable
@Override
public BrowserRoot onGetRoot(
@NonNull String clientPackageName,
int clientUid,
@Nullable Bundle rootHints) {
Bundle extras = new Bundle();
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
return new BrowserRoot(ROOT_ID, extras);
}
ضبط أنماط المحتوى لكل عنصر
يمكنك تجاهل نمط المحتوى التلقائي لأي عنصر وسائط قابل للتصفّح من العناصر التابعة له، بالإضافة إلى أي عنصر وسائط. لتجاوز الإعداد التلقائي لعناصر الوسائط القابلة للتصفّح، أنشئ حزمة إضافات في MediaDescription لعنصر الوسائط وأضِف التلميحات نفسها المذكورة سابقًا:
تنطبق قيمة
DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLEعلى العناصر التابعة القابلة للتشغيل لهذا العنصر.تنطبق قيمة
DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLEعلى العناصر الفرعية القابلة للتصفّح لهذا العنصر.
لتجاوز القيمة التلقائية لعنصر وسائط معيّن (وليس العناصر التابعة له)، أنشئ حزمة محتوى إضافي في MediaDescription لعنصر الوسائط. بعد ذلك، أضِف تلميحًا
باستخدام المفتاح [DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM][8]. استخدِم القيم نفسها الموضّحة سابقًا لتحديد طريقة عرض هذا العنصر.
تعرض مقتطفة الرمز هذه كيفية إنشاء MediaItem يمكن تصفّحه يتجاوز نمط المحتوى التلقائي الخاص به وبجميع العناصر التابعة له. يتم تنسيقه كعنصر في قائمة فئات، ويتم تنسيق العناصر التابعة القابلة للتصفّح كعناصر في قائمة، ويتم تنسيق العناصر التابعة القابلة للتشغيل كعناصر في شبكة.
Kotlin
import androidx.media.utils.MediaConstants
private fun createBrowsableMediaItem(
mediaId: String,
folderName: String,
iconUri: Uri
): MediaBrowser.MediaItem {
val mediaDescriptionBuilder = MediaDescription.Builder()
mediaDescriptionBuilder.setMediaId(mediaId)
mediaDescriptionBuilder.setTitle(folderName)
mediaDescriptionBuilder.setIconUri(iconUri)
val extras = Bundle()
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM)
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM)
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM)
mediaDescriptionBuilder.setExtras(extras)
return MediaBrowser.MediaItem(
mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE)
}
Java
import androidx.media.utils.MediaConstants;
private MediaBrowser.MediaItem createBrowsableMediaItem(
String mediaId,
String folderName,
Uri iconUri) {
MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
mediaDescriptionBuilder.setMediaId(mediaId);
mediaDescriptionBuilder.setTitle(folderName);
mediaDescriptionBuilder.setIconUri(iconUri);
Bundle extras = new Bundle();
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM);
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM);
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM);
mediaDescriptionBuilder.setExtras(extras);
return new MediaBrowser.MediaItem(
mediaDescriptionBuilder.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE);
}
تجميع العناصر باستخدام تلميحات العناوين
لتجميع عناصر الوسائط ذات الصلة، استخدِم تلميحًا لكل عنصر. يجب أن يتضمّن كل عنصر وسائط في مجموعة حزمة إضافات في MediaDescription. يجب أن تتضمّن هذه الحزمة عملية ربط بالمفتاح [DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE][9] وقيمة سلسلة مطابقة. يجب توفير ترجمة لهذه السلسلة لأنّها تُستخدَم كعنوان للمجموعة.
يوضّح مقتطف الرمز هذا كيفية إنشاء MediaItem مع عنوان مجموعة فرعية Songs:
Kotlin
import androidx.media.utils.MediaConstants
private fun createMediaItem(
mediaId: String,
folderName: String,
iconUri: Uri
): MediaBrowser.MediaItem {
val mediaDescriptionBuilder = MediaDescription.Builder()
mediaDescriptionBuilder.setMediaId(mediaId)
mediaDescriptionBuilder.setTitle(folderName)
mediaDescriptionBuilder.setIconUri(iconUri)
val extras = Bundle()
extras.putString(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
"Songs")
mediaDescriptionBuilder.setExtras(extras)
return MediaBrowser.MediaItem(
mediaDescriptionBuilder.build(), /* playable or browsable flag*/)
}
Java
import androidx.media.utils.MediaConstants;
private MediaBrowser.MediaItem createMediaItem(String mediaId, String folderName, Uri iconUri) {
MediaDescription.Builder mediaDescriptionBuilder = new MediaDescription.Builder();
mediaDescriptionBuilder.setMediaId(mediaId);
mediaDescriptionBuilder.setTitle(folderName);
mediaDescriptionBuilder.setIconUri(iconUri);
Bundle extras = new Bundle();
extras.putString(
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
"Songs");
mediaDescriptionBuilder.setExtras(extras);
return new MediaBrowser.MediaItem(
mediaDescriptionBuilder.build(), /* playable or browsable flag*/);
}
يجب أن يمرِّر تطبيقك جميع عناصر الوسائط التي تريد تجميعها معًا ككتلة متجاورة. على سبيل المثال، لنفترض أنّك تريد عرض مجموعتَين من عناصر الوسائط، "الأغاني" و "الألبومات"، بهذا الترتيب. إذا كان تطبيقك يمرّر خمسة عناصر وسائط بهذا الترتيب، سيفسّرها Android Auto وAAOS على أنّها أربع مجموعات منفصلة:
- ملف الوسائط A مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - ملف الوسائط "ب" مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") - ملف الوسائط C مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - ملف الوسائط D مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - ملف الوسائط E مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
ينتج عن ذلك المجموعات الأربع التالية:
- المجموعة 1، المسماة "الأغاني"، والتي تحتوي على وسائط العنصر A
- المجموعة 2، المسماة "الألبومات"، والتي تحتوي على وسائط البند B
- المجموعة 3، المسماة "أغانٍ"، والتي تحتوي على وسائط C وD
- المجموعة 4، المسماة "الألبومات"، والتي تحتوي على عنصر الوسائط E
لعرض هذه العناصر في مجموعتين، يجب أن يمرِّر تطبيقك عناصر الوسائط بهذا الترتيب:
- ملف الوسائط A مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - ملف الوسائط C مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - ملف الوسائط D مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Songs") - ملف الوسائط "ب" مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums") - ملف الوسائط E مع
extras.putString(MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, "Albums")
عرض مؤشرات البيانات الوصفية الإضافية
يمكنك تضمين مؤشرات بيانات وصفية إضافية لتقديم معلومات سريعة حول المحتوى في شجرة متصفّح الوسائط وأثناء التشغيل.
في شجرة الاستعراض، يقرأ كل من Android Auto وAAOS البيانات الإضافية المرتبطة بعنصر ويعرضان المؤشرات. أثناء تشغيل الوسائط، يقرأ كل من Android Auto وAAOS البيانات الوصفية لجلسة الوسائط ويبحث عن ثوابت معيّنة لتحديد المؤشرات التي سيتم عرضها.
الشكل 3: عرض التشغيل مع البيانات الوصفية
الشكل 4. طريقة عرض المحتوى الذي لم يتم تشغيله
يمكن استخدام هذه الثوابت في كلٍّ من إضافات الأوصاف MediaItem والإضافات MediaMetadata:
[
EXTRA_DOWNLOAD_STATUS][10]: يشير إلى حالة تنزيل أحد العناصر. استخدِم هذه القيمة الثابتة كمفتاح. الثوابت الطويلة التالية هي قيم محتملة:- [
STATUS_DOWNLOADED][11]: تم تنزيل العنصر بالكامل. - [
STATUS_DOWNLOADING][12]: يجري تنزيل الملف. - [
STATUS_NOT_DOWNLOADED][13]: لم يتم تنزيل العنصر.
- [
[
METADATA_KEY_IS_EXPLICIT][14]: يشير إلى أنّ العنصر يتضمّن محتوًى فاضحًا. لتحديد أنّ السلعة تتضمّن محتوًى فاضحًا، استخدِم هذا الثابت كمفتاح وlong [METADATA_VALUE_ATTRIBUTE_PRESENT][15] كقيمة.
لا يمكن استخدام هذه الثوابت إلا في إضافات أوصاف MediaItem:
[
DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS][16]: يشير إلى حالة اكتمال المحتوى الطويل، مثل حلقات البودكاست والكتب المسموعة. استخدِم هذا الثابت كمفتاح. في ما يلي الثوابت الصحيحة التي يمكن استخدامها كقيم:[
DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED][17]: لم يتم تشغيل العنصر.[
DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED][18]: تم تشغيل جزء من العنصر، والموضع الحالي في المنتصف.[
DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED][19]: تم إكمال العنصر.
[
DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE][20]: يشير إلى اكتمال المحتوى الطويل كقيمة مزدوجة بين 0.0 و1.0، بما في ذلك هذين الرقمَين. يوفّر ذلك المزيد من المعلومات حول حالةPARTIALLY_PLAYING، ما يسمح لتطبيق Android Auto أو نظام التشغيل AAOS بعرض مؤشر تقدّم أكثر فائدة، مثل شريط تقدّم. إذا كنت تستخدم هذه الميزة الإضافية، يمكنك الاطّلاع على [تعديل شريط التقدم في عرض التصفح أثناء تشغيل المحتوى][21] لمعرفة كيفية إبقاء هذا المؤشر محدّثًا بعد الانطباع الأوّلي.
لعرض المؤشرات التي تظهر أثناء تصفّح المستخدم لشجرة تصفّح الوسائط، أنشئ حزمة إضافات تتضمّن واحدًا أو أكثر من هذه الثوابت.
بعد ذلك، مرِّر هذه الحزمة إلى الطريقة MediaDescription.Builder.setExtras.
يوضّح هذا المقتطف كيفية عرض مؤشرات لعنصر وسائط صريح تم إكماله بنسبة% 70:
Kotlin
import androidx.media.utils.MediaConstants
val extras = Bundle()
extras.putLong(
MediaConstants.METADATA_KEY_IS_EXPLICIT,
MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED)
extras.putDouble(
MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7)
val description =
MediaDescriptionCompat.Builder()
.setMediaId(/*...*/)
.setTitle(resources.getString(/*...*/))
.setExtras(extras)
.build()
return MediaBrowserCompat.MediaItem(description, /* flags */)
Java
import androidx.media.utils.MediaConstants;
Bundle extras = new Bundle();
extras.putLong(
MediaConstants.METADATA_KEY_IS_EXPLICIT,
MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT);
extras.putInt(
MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED);
extras.putDouble(
MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.7);
MediaDescriptionCompat description =
new MediaDescriptionCompat.Builder()
.setMediaId(/*...*/)
.setTitle(resources.getString(/*...*/))
.setExtras(extras)
.build();
return new MediaBrowserCompat.MediaItem(description, /* flags */);
لعرض مؤشرات لعنصر وسائط يتم تشغيله حاليًا، حدِّد قيمًا لـ METADATA_KEY_IS_EXPLICIT أو EXTRA_DOWNLOAD_STATUS في MediaMetadataCompat ضمن mediaSession.
يوضّح مقتطف الرمز البرمجي التالي كيفية الإشارة إلى أنّ الأغنية المعروضة في طريقة عرض التشغيل تتضمّن محتوًى فاضحًا وتم تنزيلها:
Kotlin
import androidx.media.utils.MediaConstants
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putString(
MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
.putString(
MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
.putString(
MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
albumArtUri.toString())
.putLong(
MediaConstants.METADATA_KEY_IS_EXPLICIT,
MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
.putLong(
MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
MediaDescriptionCompat.STATUS_DOWNLOADED)
.build())
Java
import androidx.media.utils.MediaConstants;
mediaSession.setMetadata(
new MediaMetadataCompat.Builder()
.putString(
MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Song Name")
.putString(
MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Artist name")
.putString(
MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
albumArtUri.toString())
.putLong(
MediaConstants.METADATA_KEY_IS_EXPLICIT,
MediaConstants.METADATA_VALUE_ATTRIBUTE_PRESENT)
.putLong(
MediaDescriptionCompat.EXTRA_DOWNLOAD_STATUS,
MediaDescriptionCompat.STATUS_DOWNLOADED)
.build());
تعديل شريط التقدّم في طريقة العرض "تصفّح" أثناء تشغيل المحتوى
يمكنك استخدام السمة [DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE][20] الإضافية
لعرض شريط تقدّم للمحتوى الذي تم تشغيله جزئيًا في عرض التصفّح.
ومع ذلك، إذا واصل المستخدم تشغيل المحتوى الذي تم تشغيله جزئيًا، سيصبح هذا المؤشر غير دقيق بمرور الوقت.
لكي يواصل Android Auto وAAOS تعديل شريط التقدّم، يجب تقديم معلومات إضافية في MediaMetadataCompat وPlaybackStateCompat لربط المحتوى الجاري تشغيله بعناصر الوسائط في عرض التصفّح.
لكي يظهر شريط تقدّم يتم تعديله تلقائيًا في عنصر الوسائط، يجب استيفاء المتطلبات التالية:
عند إنشاء
MediaItem، يجب أن يرسل [DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE][20] في الإضافات الخاصة به بقيمة تتراوح بين0.0و1.0، بما في ذلك القيمتان.يجب أن يرسل
MediaMetadataCompat[METADATA_KEY_MEDIA_ID][22] مع قيمة سلسلة تساوي [معرّف الوسائط][23] الذي تم تمريره إلىMediaItem.يجب أن يتضمّن
PlaybackStateCompatعنصرًا إضافيًا بالمفتاح [PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID][24] الذي يتم ربطه بقيمة سلسلة تساوي [معرّف الوسائط][23] الذي تم تمريره إلىMediaItem.
يوضّح مقتطف الرمز البرمجي هذا كيفية الإشارة إلى أنّ العنصر الذي يتم تشغيله مرتبط بعنصر في عرض التصفّح:
Kotlin
import androidx.media.utils.MediaConstants
// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
val mediaItemExtras = Bundle()
mediaItemExtras.putDouble(
MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25)
val description =
MediaDescriptionCompat.Builder()
.setMediaId("my-media-id")
.setExtras(mediaItemExtras)
// ...and any other setters.
.build()
return MediaBrowserCompat.MediaItem(description, /* flags */)
// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
// ...and any other setters.
.build())
val playbackStateExtras = Bundle()
playbackStateExtras.putString(
MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id")
mediaSession.setPlaybackState(
PlaybackStateCompat.Builder()
.setExtras(playbackStateExtras)
// ...and any other setters.
.build())
Java
import androidx.media.utils.MediaConstants;
// When the MediaItem is constructed to show in the browse view.
// Suppose the item was 25% complete when the user launched the browse view.
Bundle mediaItemExtras = new Bundle();
mediaItemExtras.putDouble(
MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, 0.25);
MediaDescriptionCompat description =
new MediaDescriptionCompat.Builder()
.setMediaId("my-media-id")
.setExtras(mediaItemExtras)
// ...and any other setters.
.build();
return new MediaBrowserCompat.MediaItem(description, /* flags */);
// Elsewhere, when the user has selected MediaItem for playback.
mediaSession.setMetadata(
new MediaMetadataCompat.Builder()
.putString(MediaMetadata.METADATA_KEY_MEDIA_ID, "my-media-id")
// ...and any other setters.
.build());
Bundle playbackStateExtras = new Bundle();
playbackStateExtras.putString(
MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID, "my-media-id");
mediaSession.setPlaybackState(
new PlaybackStateCompat.Builder()
.setExtras(playbackStateExtras)
// ...and any other setters.
.build());
```
حتى المحتوى الذي لم يتم تشغيله أو الذي تم تشغيله بالكامل يمكن أن يعرض شريط تقدم يتم تعديله تلقائيًا. يحدث ذلك إذا كانت عناصر الوسائط المقابلة تتضمّن
DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE الإضافية بالقيمة 0.0
(للمحتوى الذي لم يتم تشغيله) أو 1.0 (للمحتوى الذي تم تشغيله بالكامل). بعد أن يختار المستخدم عناصر الوسائط هذه، يعرض كل من Android Auto وAAOS شريط التقدم فوق مؤشرات التقدم الأخرى.
[1]: /training/cars/media/create-media-browser/content-hierarchy [2]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE() [3]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE() [4]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM() [5]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM() [6]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM() [7]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM() [8]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM() [9]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE() [10]: /reference/android/support/v4/media/MediaDescriptionCompat#EXTRA_DOWNLOAD_STATUS() [11]: /reference/android/support/v4/media/MediaDescriptionCompat#STATUS_DOWNLOADED() [12]: /reference/android/support/v4/media/MediaDescriptionCompat#STATUS_DOWNLOADING() [13]: /reference/android/support/v4/media/MediaDescriptionCompat#STATUS_NOT_DOWNLOADED() [14]: /reference/androidx/media/utils/MediaConstants#METADATA_KEY_IS_EXPLICIT() [15]: /reference/androidx/media/utils/MediaConstants#METADATA_VALUE_ATTRIBUTE_PRESENT() [16]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS() [17]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED() [18]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED() [19]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED() [20]: /reference/androidx/media/utils/MediaConstants#DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE() [21]: #browse-progress-bar [22]: /reference/android/support/v4/media/MediaMetadataCompat#METADATA_KEY_MEDIA_ID() [23]: /reference/android/support/v4/media/MediaDescriptionCompat.Builder#setMediaId(java.lang.String) [24]: /reference/androidx/media/utils/MediaConstants#PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID()