به یک برنامه رسانه متصل شوید

یک کنترلر رسانه با یک جلسه رسانه تعامل دارد تا پخش برنامه رسانه را پرس و جو و کنترل کند. در Media3، MediaController API رابط Player را پیاده سازی می کند. نمونه هایی از برنامه های مشتری که از کنترلر رسانه استفاده می کنند عبارتند از:

یک کنترل‌کننده رسانه همچنین می‌تواند در یک برنامه رسانه مفید باشد، برای مثال اگر پخش‌کننده و جلسه رسانه در Service جدا از Activity یا Fragment با رابط کاربری زندگی می‌کنند.

یک MediaController ایجاد کنید

برای ایجاد MediaController ، با ایجاد SessionToken برای MediaSession مربوطه شروع کنید. متد onStart() Activity یا Fragment می تواند مکان خوبی برای این کار باشد.

کاتلین

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

جاوا

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

استفاده از این SessionToken برای ساختن MediaController ، کنترلر را به جلسه داده شده متصل می کند. این به صورت ناهمزمان انجام می شود، بنابراین باید به نتیجه گوش دهید و در صورت وجود از آن استفاده کنید.

کاتلین

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

جاوا

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 به راهنمای رویدادهای Player مراجعه کنید.

رابط MediaController.Listener تماس های اضافی را برای رویدادها و دستورات سفارشی از MediaSession متصل تعریف می کند. به عنوان مثال، onCustomCommand() زمانی که جلسه یک فرمان سفارشی ارسال می کند، onAvailableSessionCommandsChanged() زمانی که جلسه دستورات جلسه موجود را تغییر می دهد یا onDisconnected() زمانی که کنترلر از جلسه جدا می شود.

یک MediaController.Listener را می توان هنگام ساخت کنترلر با یک Builder تنظیم کرد:

کاتلین

MediaController.Builder(context, sessionToken)
    .setListener(
      object : MediaController.Listener {
        override fun onCustomCommand(
          controller: MediaController,
          command: SessionCommand,
          args: Bundle,
        ): ListenableFuture<SessionResult> {
          // Handle custom command.
          return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
        }

        override fun onDisconnected(controller: MediaController) {
          // Handle disconnection.
        }
      }
    )
    .buildAsync()

جاوا

new MediaController.Builder(context, sessionToken)
    .setListener(
        new MediaController.Listener() {
          @Override
          public ListenableFuture<SessionResult> onCustomCommand(
              MediaController controller, SessionCommand command, Bundle args) {
            // Handle custom command.
            return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
          }

          @Override
          public void onDisconnected(MediaController controller) {
            // Handle disconnection.
          }
        })
    .buildAsync();

مانند سایر مؤلفه‌ها، به یاد داشته باشید که MediaController زمانی که دیگر مورد نیاز نیست، آزاد کنید، مانند متد onStop() یک Activity یا Fragment .

کاتلین

MediaController.releaseFuture(controllerFuture)

جاوا

MediaController.releaseFuture(controllerFuture);

با آزاد کردن کنترلر، تمام دستورات معلق ارسال شده به جلسه ارسال می شود و فقط پس از مدیریت این دستورات و یا پس از یک دوره وقفه، هرکدام که اول اتفاق بیفتد، از سرویس جلسه خارج می شود.

ایجاد و استفاده از MediaBrowser

MediaBrowser بر روی قابلیت های ارائه شده توسط MediaController ساخته می شود تا مرور کتابخانه رسانه ارائه شده توسط MediaLibraryService یک برنامه رسانه را نیز فعال کند.

کاتلین

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

جاوا

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

برای شروع مرور کتابخانه محتوای برنامه رسانه، ابتدا گره ریشه را با getLibraryRoot() بازیابی کنید:

کاتلین

// 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())

جاوا

// 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 :

کاتلین

// 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())

جاوا

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());

نمایش کنترل های پخش برای برنامه رسانه دیگری

هنگام نمایش کنترل‌های UI با دکمه‌هایی برای برنامه رسانه دیگری، مهم است که تنظیمات برگزیده دکمه رسانه اعلام شده آن برنامه را دنبال کنید.

بهترین راه برای حل و فصل تنظیمات برگزیده برنامه و محدودیت ها و الزامات رابط کاربری شما، استفاده از CommandButton.DisplayConstraints است. شما می‌توانید محدودیت‌ها و محدودیت‌هایی را برای رابط کاربری خود تعریف کنید، و روش resolve ، فهرست مشخصی از دکمه‌ها را برای نمایش با نماد، موقعیت و عملکرد مورد نظر ارائه می‌دهد.

،

یک کنترلر رسانه با یک جلسه رسانه تعامل دارد تا پخش برنامه رسانه را پرس و جو و کنترل کند. در Media3، MediaController API رابط Player را پیاده سازی می کند. نمونه هایی از برنامه های مشتری که از کنترلر رسانه استفاده می کنند عبارتند از:

یک کنترل‌کننده رسانه همچنین می‌تواند در یک برنامه رسانه مفید باشد، برای مثال اگر پخش‌کننده و جلسه رسانه در Service جدا از Activity یا Fragment با رابط کاربری زندگی می‌کنند.

یک MediaController ایجاد کنید

برای ایجاد MediaController ، با ایجاد SessionToken برای MediaSession مربوطه شروع کنید. متد onStart() Activity یا Fragment می تواند مکان خوبی برای این کار باشد.

کاتلین

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

جاوا

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

استفاده از این SessionToken برای ساختن MediaController ، کنترلر را به جلسه داده شده متصل می کند. این به صورت ناهمزمان انجام می شود، بنابراین باید به نتیجه گوش دهید و در صورت وجود از آن استفاده کنید.

کاتلین

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

جاوا

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 به راهنمای رویدادهای Player مراجعه کنید.

رابط MediaController.Listener تماس های اضافی را برای رویدادها و دستورات سفارشی از MediaSession متصل تعریف می کند. به عنوان مثال، onCustomCommand() زمانی که جلسه یک فرمان سفارشی ارسال می کند، onAvailableSessionCommandsChanged() زمانی که جلسه دستورات جلسه موجود را تغییر می دهد یا onDisconnected() زمانی که کنترلر از جلسه جدا می شود.

یک MediaController.Listener را می توان هنگام ساخت کنترلر با یک Builder تنظیم کرد:

کاتلین

MediaController.Builder(context, sessionToken)
    .setListener(
      object : MediaController.Listener {
        override fun onCustomCommand(
          controller: MediaController,
          command: SessionCommand,
          args: Bundle,
        ): ListenableFuture<SessionResult> {
          // Handle custom command.
          return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
        }

        override fun onDisconnected(controller: MediaController) {
          // Handle disconnection.
        }
      }
    )
    .buildAsync()

جاوا

new MediaController.Builder(context, sessionToken)
    .setListener(
        new MediaController.Listener() {
          @Override
          public ListenableFuture<SessionResult> onCustomCommand(
              MediaController controller, SessionCommand command, Bundle args) {
            // Handle custom command.
            return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
          }

          @Override
          public void onDisconnected(MediaController controller) {
            // Handle disconnection.
          }
        })
    .buildAsync();

مانند سایر مؤلفه‌ها، به یاد داشته باشید که MediaController زمانی که دیگر مورد نیاز نیست، آزاد کنید، مانند متد onStop() یک Activity یا Fragment .

کاتلین

MediaController.releaseFuture(controllerFuture)

جاوا

MediaController.releaseFuture(controllerFuture);

با آزاد کردن کنترلر، تمام دستورات معلق ارسال شده به جلسه ارسال می شود و فقط پس از مدیریت این دستورات و یا پس از یک دوره وقفه، هرکدام که اول اتفاق بیفتد، از سرویس جلسه خارج می شود.

ایجاد و استفاده از MediaBrowser

MediaBrowser بر روی قابلیت های ارائه شده توسط MediaController ساخته می شود تا مرور کتابخانه رسانه ارائه شده توسط MediaLibraryService یک برنامه رسانه را نیز فعال کند.

کاتلین

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

جاوا

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

برای شروع مرور کتابخانه محتوای برنامه رسانه، ابتدا گره ریشه را با getLibraryRoot() بازیابی کنید:

کاتلین

// 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())

جاوا

// 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 :

کاتلین

// 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())

جاوا

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());

نمایش کنترل های پخش برای برنامه رسانه دیگری

هنگام نمایش کنترل‌های UI با دکمه‌هایی برای برنامه رسانه دیگری، مهم است که تنظیمات برگزیده دکمه رسانه اعلام شده آن برنامه را دنبال کنید.

بهترین راه برای حل و فصل تنظیمات برگزیده برنامه و محدودیت ها و الزامات رابط کاربری شما، استفاده از CommandButton.DisplayConstraints است. شما می‌توانید محدودیت‌ها و محدودیت‌هایی را برای رابط کاربری خود تعریف کنید، و روش resolve ، فهرست مشخصی از دکمه‌ها را برای نمایش با نماد، موقعیت و عملکرد مورد نظر ارائه می‌دهد.

،

یک کنترلر رسانه با یک جلسه رسانه تعامل دارد تا پخش برنامه رسانه را پرس و جو و کنترل کند. در Media3، MediaController API رابط Player را پیاده سازی می کند. نمونه هایی از برنامه های مشتری که از کنترلر رسانه استفاده می کنند عبارتند از:

یک کنترل‌کننده رسانه همچنین می‌تواند در یک برنامه رسانه مفید باشد، برای مثال اگر پخش‌کننده و جلسه رسانه در Service جدا از Activity یا Fragment با رابط کاربری زندگی می‌کنند.

یک MediaController ایجاد کنید

برای ایجاد MediaController ، با ایجاد SessionToken برای MediaSession مربوطه شروع کنید. متد onStart() Activity یا Fragment می تواند مکان خوبی برای این کار باشد.

کاتلین

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

جاوا

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

استفاده از این SessionToken برای ساختن MediaController ، کنترلر را به جلسه داده شده متصل می کند. این به صورت ناهمزمان انجام می شود، بنابراین باید به نتیجه گوش دهید و در صورت وجود از آن استفاده کنید.

کاتلین

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

جاوا

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 به راهنمای رویدادهای Player مراجعه کنید.

رابط MediaController.Listener تماس های اضافی را برای رویدادها و دستورات سفارشی از MediaSession متصل تعریف می کند. به عنوان مثال، onCustomCommand() زمانی که جلسه یک فرمان سفارشی ارسال می کند، onAvailableSessionCommandsChanged() زمانی که جلسه دستورات جلسه موجود را تغییر می دهد یا onDisconnected() زمانی که کنترلر از جلسه جدا می شود.

یک MediaController.Listener را می توان هنگام ساخت کنترلر با یک Builder تنظیم کرد:

کاتلین

MediaController.Builder(context, sessionToken)
    .setListener(
      object : MediaController.Listener {
        override fun onCustomCommand(
          controller: MediaController,
          command: SessionCommand,
          args: Bundle,
        ): ListenableFuture<SessionResult> {
          // Handle custom command.
          return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
        }

        override fun onDisconnected(controller: MediaController) {
          // Handle disconnection.
        }
      }
    )
    .buildAsync()

جاوا

new MediaController.Builder(context, sessionToken)
    .setListener(
        new MediaController.Listener() {
          @Override
          public ListenableFuture<SessionResult> onCustomCommand(
              MediaController controller, SessionCommand command, Bundle args) {
            // Handle custom command.
            return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
          }

          @Override
          public void onDisconnected(MediaController controller) {
            // Handle disconnection.
          }
        })
    .buildAsync();

مانند سایر مؤلفه‌ها، به یاد داشته باشید که MediaController زمانی که دیگر مورد نیاز نیست، آزاد کنید، مانند متد onStop() یک Activity یا Fragment .

کاتلین

MediaController.releaseFuture(controllerFuture)

جاوا

MediaController.releaseFuture(controllerFuture);

با آزاد کردن کنترلر، تمام دستورات معلق ارسال شده به جلسه ارسال می شود و فقط پس از مدیریت این دستورات و یا پس از یک دوره وقفه، هرکدام که اول اتفاق بیفتد، از سرویس جلسه خارج می شود.

ایجاد و استفاده از MediaBrowser

MediaBrowser بر روی قابلیت های ارائه شده توسط MediaController ساخته می شود تا مرور کتابخانه رسانه ارائه شده توسط MediaLibraryService یک برنامه رسانه را نیز فعال کند.

کاتلین

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

جاوا

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

برای شروع مرور کتابخانه محتوای برنامه رسانه، ابتدا گره ریشه را با getLibraryRoot() بازیابی کنید:

کاتلین

// 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())

جاوا

// 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 :

کاتلین

// 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())

جاوا

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());

نمایش کنترل های پخش برای برنامه رسانه دیگری

هنگام نمایش کنترل‌های UI با دکمه‌هایی برای برنامه رسانه دیگری، مهم است که تنظیمات برگزیده دکمه رسانه اعلام شده آن برنامه را دنبال کنید.

بهترین راه برای حل و فصل تنظیمات برگزیده برنامه و محدودیت ها و الزامات رابط کاربری شما، استفاده از CommandButton.DisplayConstraints است. شما می‌توانید محدودیت‌ها و محدودیت‌هایی را برای رابط کاربری خود تعریف کنید، و روش resolve ، فهرست مشخصی از دکمه‌ها را برای نمایش با نماد، موقعیت و عملکرد مورد نظر ارائه می‌دهد.

،

یک کنترلر رسانه با یک جلسه رسانه تعامل دارد تا پخش برنامه رسانه را پرس و جو و کنترل کند. در Media3، MediaController API رابط Player را پیاده سازی می کند. نمونه هایی از برنامه های مشتری که از کنترلر رسانه استفاده می کنند عبارتند از:

یک کنترل‌کننده رسانه همچنین می‌تواند در یک برنامه رسانه مفید باشد، برای مثال اگر پخش‌کننده و جلسه رسانه در Service جدا از Activity یا Fragment با رابط کاربری زندگی می‌کنند.

یک MediaController ایجاد کنید

برای ایجاد MediaController ، با ایجاد SessionToken برای MediaSession مربوطه شروع کنید. متد onStart() Activity یا Fragment می تواند مکان خوبی برای این کار باشد.

کاتلین

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

جاوا

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

استفاده از این SessionToken برای ساختن MediaController ، کنترلر را به جلسه داده شده متصل می کند. این به صورت ناهمزمان انجام می شود، بنابراین باید به نتیجه گوش دهید و در صورت وجود از آن استفاده کنید.

کاتلین

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

جاوا

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 به راهنمای رویدادهای Player مراجعه کنید.

رابط MediaController.Listener تماس های اضافی را برای رویدادها و دستورات سفارشی از MediaSession متصل تعریف می کند. به عنوان مثال، onCustomCommand() زمانی که جلسه یک فرمان سفارشی ارسال می کند، onAvailableSessionCommandsChanged() زمانی که جلسه دستورات جلسه موجود را تغییر می دهد یا onDisconnected() زمانی که کنترلر از جلسه جدا می شود.

یک MediaController.Listener را می توان هنگام ساخت کنترلر با یک Builder تنظیم کرد:

کاتلین

MediaController.Builder(context, sessionToken)
    .setListener(
      object : MediaController.Listener {
        override fun onCustomCommand(
          controller: MediaController,
          command: SessionCommand,
          args: Bundle,
        ): ListenableFuture<SessionResult> {
          // Handle custom command.
          return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
        }

        override fun onDisconnected(controller: MediaController) {
          // Handle disconnection.
        }
      }
    )
    .buildAsync()

جاوا

new MediaController.Builder(context, sessionToken)
    .setListener(
        new MediaController.Listener() {
          @Override
          public ListenableFuture<SessionResult> onCustomCommand(
              MediaController controller, SessionCommand command, Bundle args) {
            // Handle custom command.
            return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
          }

          @Override
          public void onDisconnected(MediaController controller) {
            // Handle disconnection.
          }
        })
    .buildAsync();

مانند سایر مؤلفه‌ها، به یاد داشته باشید که MediaController زمانی که دیگر مورد نیاز نیست، آزاد کنید، مانند متد onStop() یک Activity یا Fragment .

کاتلین

MediaController.releaseFuture(controllerFuture)

جاوا

MediaController.releaseFuture(controllerFuture);

با آزاد کردن کنترلر، تمام دستورات معلق ارسال شده به جلسه ارسال می شود و فقط پس از مدیریت این دستورات و یا پس از یک دوره وقفه، هرکدام که اول اتفاق بیفتد، از سرویس جلسه خارج می شود.

ایجاد و استفاده از MediaBrowser

MediaBrowser بر روی قابلیت های ارائه شده توسط MediaController ساخته می شود تا مرور کتابخانه رسانه ارائه شده توسط MediaLibraryService یک برنامه رسانه را نیز فعال کند.

کاتلین

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

جاوا

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

برای شروع مرور کتابخانه محتوای برنامه رسانه، ابتدا گره ریشه را با getLibraryRoot() بازیابی کنید:

کاتلین

// 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())

جاوا

// 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 :

کاتلین

// 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())

جاوا

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());

نمایش کنترل های پخش برای برنامه رسانه دیگری

هنگام نمایش کنترل‌های UI با دکمه‌هایی برای برنامه رسانه دیگری، مهم است که تنظیمات برگزیده دکمه رسانه اعلام شده آن برنامه را دنبال کنید.

بهترین راه برای حل و فصل تنظیمات برگزیده برنامه و محدودیت ها و الزامات رابط کاربری شما، استفاده از CommandButton.DisplayConstraints است. شما می‌توانید محدودیت‌ها و محدودیت‌هایی را برای رابط کاربری خود تعریف کنید، و روش resolve ، فهرست مشخصی از دکمه‌ها را برای نمایش با نماد، موقعیت و عملکرد مورد نظر ارائه می‌دهد.