الربط بتطبيق وسائط

تتفاعل وحدة التحكم في الوسائط مع جلسة وسائط للاستعلام عن الوسائط والتحكم فيها لتشغيل التطبيق. في Media3، MediaController تنفّذ واجهة برمجة التطبيقات الواجهة Player. أمثلة على تطبيقات العميل التي تستخدم وسائط تشمل وحدة التحكم ما يلي:

يمكن أن تكون وحدة التحكم في الوسائط مفيدة أيضًا داخل تطبيق وسائط، على سبيل المثال إذا كان المستخدم وجلسة الوسائط المباشرة في Service منفصلة عن Activity أو Fragment مع واجهة المستخدم.

إنشاء MediaController

لإنشاء MediaController، ابدأ بإنشاء SessionToken MediaSession المقابلة. الطريقة onStart() لـ Activity أو يمكن أن يكون المكان "Fragment" مناسبًا لهذا الغرض.

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

عند استخدام SessionToken لإنشاء MediaController، يتم ربط المستخدم إلى جلسة معينة. يحدث هذا بشكل غير متزامن، لذلك يجب عليك استمع إلى النتيجة واستخدمها عند توفرها.

Kotlin

val controllerFuture =
  MediaController.Builder(context, sessionToken).buildAsync()
controllerFuture.addListener({
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaController> controllerFuture =
  new MediaController.Builder(context, sessionToken).buildAsync();
controllerFuture.addListener(() -> {
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor());

استخدام MediaController

بإمكان MediaController تنفيذ الواجهة Player، ما يتيح لك استخدام الأوامر. محدد في الواجهة للتحكم في تشغيل MediaSession المتصل. يعني ذلك أنّ الاتصال بـ play() على هاتف MediaController سيؤدي إلى إرسال إلى MediaSession المرتبط، والذي سيفوّض لاحقًا إلى Player الأساسي.

وبالمثل، يمكنك إضافة Player.Listener إلى وحدة التحكّم للاستماع إلى التغييرات في الحالة Player. ارجع إلى دليل أحداث اللاعبين لمزيد من التفاصيل عن استخدام Player.Listener. MediaController.Listener تحدد واجهة المستخدم عمليات الاستدعاء الإضافية للأحداث والأوامر الواردة من الأجهزة المتصلة MediaSession، مثل onAvailableSessionCommandsChanged() عندما تغير جلسة الوسائط أوامر الجلسات المتاحة onDisconnected() عندما يتم فصل وحدة التحكم من الجلسة.

كما هو الحال مع المكونات الأخرى، لا تنسَ تحرير MediaController عندما يكون لم تعد هناك حاجة إليها، كما هو الحال في طريقة onStop() في Activity أو Fragment

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

سيؤدي تحرير وحدة التحكم إلى مواصلة تسليم جميع الأوامر المعلقة التي تم إرسالها إلى وإلغاء الربط من خدمة الجلسة فقط إما بعد انتهاء هذه الأوامر قد تم التعامل معها أو بعد فترة المهلة، أيهما يحدث أولاً.

إنشاء MediaBrowser واستخدامه

تعتمد MediaBrowser على الإمكانات التي يوفرها MediaController لتمكين تصفح مكتبة الوسائط التي تقدمها إحدى الوسائط أيضًا MediaLibraryService للتطبيق.

Kotlin

val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
browserFuture.addListener({
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaBrowser> browserFuture =
  new MediaBrowser.Builder(context, sessionToken).buildAsync();
browserFuture.addListener(() -> {
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor());

لبدء تصفُّح مكتبة محتوى تطبيق الوسائط، عليك استرداد العقدة الجذر أولاً. مع getLibraryRoot():

Kotlin

// Get the library root to start browsing the library tree.
val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null)
rootFuture.addListener({
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor())

Java

// Get the library root to start browsing the library tree.
ListenableFuture<LibraryResult<MediaItem>> rootFuture =
  mediaBrowser.getLibraryRoot(/* params= */ null);
rootFuture.addListener(() -> {
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor());

يمكنك بعد ذلك التنقل عبر مكتبة الوسائط عن طريق استرداد العناصر الثانوية MediaItem في المكتبة مع getChildren(). على سبيل المثال، لاسترداد قيمة العناصر الثانوية للعقدة الجذر MediaItem:

Kotlin

// Get the library root to start browsing the library tree.
val childrenFuture = 
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null)
childrenFuture.addListener({
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor())

Java

ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture =
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null);
childrenFuture.addListener(() -> {
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor());