একটি মিডিয়া অ্যাপের সাথে সংযোগ করুন৷

মিডিয়া অ্যাপে সংযোগ করার দুটি উপায় আছে:

  1. MediaController
  2. MediaBrowser

MediaController

একটি মিডিয়া কন্ট্রোলার কোনো মিডিয়া অ্যাপের প্লেব্যাক জিজ্ঞাসা ও নিয়ন্ত্রণ করার জন্য একটি মিডিয়া সেশনের সাথে যোগাযোগ করে। Media3-তে, MediaController API, Player ইন্টারফেসটি ইমপ্লিমেন্ট করে। মিডিয়া কন্ট্রোলার ব্যবহারকারী ক্লায়েন্ট অ্যাপের উদাহরণগুলির মধ্যে রয়েছে:

একটি মিডিয়া অ্যাপের ভেতরেও মিডিয়া কন্ট্রোলার কার্যকর হতে পারে, যেমন, যদি প্লেয়ার এবং মিডিয়া সেশনটি UI-যুক্ত Activity বা Fragment থেকে আলাদা কোনো Service এ থাকে।

একটি MediaController তৈরি করুন

একটি MediaController তৈরি করতে, প্রথমে সংশ্লিষ্ট MediaSession জন্য একটি SessionToken তৈরি করুন। আপনার Activity বা Fragment এর onStart() মেথডটি এর জন্য একটি ভালো জায়গা হতে পারে।

কোটলিন

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 এর প্লেব্যাক নিয়ন্ত্রণ করতে এই ইন্টারফেসে সংজ্ঞায়িত কমান্ডগুলো ব্যবহার করতে পারেন। এর অর্থ হলো, একটি MediaControllerplay() কল করলে কমান্ডটি সংযুক্ত MediaSession এ পাঠানো হয়, যা পরবর্তীতে কমান্ডটি তার অন্তর্নিহিত Player এর কাছে অর্পণ করে।

Player অবস্থার পরিবর্তন শোনার জন্য আপনি কন্ট্রোলারে একটি Player.Listener যোগ করতে পারেন। Player.Listener ব্যবহারের বিষয়ে আরও বিস্তারিত জানতে প্লেয়ার ইভেন্টস গাইডটি দেখুন।

MediaController.Listener ইন্টারফেসটি সংযুক্ত MediaSession থেকে আসা ইভেন্ট এবং কাস্টম কমান্ডের জন্য অতিরিক্ত কলব্যাক সংজ্ঞায়িত করে। উদাহরণস্বরূপ onCustomCommand() যখন সেশন একটি কাস্টম কমান্ড পাঠায়, onAvailableSessionCommandsChanged() যখন সেশন উপলব্ধ সেশন কমান্ড পরিবর্তন করে অথবা onDisconnected() যখন কন্ট্রোলারটি সেশন থেকে সংযোগ বিচ্ছিন্ন হয়।

Builder ব্যবহার করে কন্ট্রোলার তৈরি করার সময় একটি MediaController.Listener সেট করা যেতে পারে:

কোটলিন

val controllerFuture =
  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()

জাভা

ListenableFuture<MediaController> controllerFuture =
    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 আর প্রয়োজন হয় না, তখন এটিকে রিলিজ করতে মনে রাখবেন; যেমন কোনো Activity বা Fragment এর onStop() মেথডে।

কোটলিন

MediaController.releaseFuture(controllerFuture)

জাভা

MediaController.releaseFuture(controllerFuture);

কন্ট্রোলারটি রিলিজ করলেও সেশনে পাঠানো সমস্ত মুলতুবি থাকা কমান্ড ডেলিভার হবে এবং এই কমান্ডগুলি হ্যান্ডেল করা হয়ে গেলে অথবা একটি টাইমআউট পিরিয়ড শেষ হওয়ার পর, দুটির মধ্যে যেটি আগে ঘটবে, তখনই এটি সেশন সার্ভিস থেকে আনবাইন্ড হবে।

MediaBrowser

একটি MediaBrowser MediaController এর সক্ষমতার উপর ভিত্তি করে একটি মিডিয়া অ্যাপের MediaLibraryService দ্বারা প্রদত্ত মিডিয়া লাইব্রেরি ব্রাউজ করার সুযোগও তৈরি করে।

একটি MediaBrowser তৈরি করুন

কোটলিন

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

একটি MediaBrowser ব্যবহার করুন

মিডিয়া অ্যাপের কন্টেন্ট লাইব্রেরি ব্রাউজ করা শুরু করতে, প্রথমে 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());

এরপর আপনি getChildren() ব্যবহার করে লাইব্রেরির কোনো MediaItem এর চাইল্ডগুলো পুনরুদ্ধার করার মাধ্যমে মিডিয়া লাইব্রেরির মধ্যে নেভিগেট করতে পারবেন। উদাহরণস্বরূপ, রুট নোড 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 ব্যবহার করুন। আপনি আপনার UI-এর ক্ষমতার সীমা ও সীমাবদ্ধতা নির্ধারণ করতে পারেন, এবং resolve মেথডটি আইকন, অবস্থান ও উদ্দিষ্ট অ্যাকশনসহ প্রদর্শিতব্য বাটনগুলোর একটি নির্দিষ্ট তালিকা প্রদান করে। যদি কোনো ব্যবহারকারী এই বাটনগুলোর কোনো একটিতে ক্লিক করেন, তাহলে আপনি মিডিয়া অ্যাপে সংশ্লিষ্ট অ্যাকশনটি চালু করতে CommandButton.executeAction ব্যবহার করতে পারেন।

কোটলিন

// Get media button preferences from media app
val mediaButtonPreferences = controller.getMediaButtonPreferences()
// Declare constraints of UI (example: limit overflow button to one)
val displayConstraints =
  DisplayConstraints.Builder().setMaxButtonsForSlot(CommandButton.SLOT_OVERFLOW, 1).build()
// Resolve media app preferences with constraints
val resolvedButtons = displayConstraints.resolve(mediaButtonPreferences, controller)
// Display buttons in UI
for (button in resolvedButtons) {
  generateUiButton(
    uiPosition = button.slots[0],
    icon = getIconRes(button.icon),
    onClick = { button.executeAction(controller) },
  )
}

জাভা

// Get media button preferences from media app
List<CommandButton> mediaButtonPreferences = controller.getMediaButtonPreferences();
// Declare constraints of UI (example: limit overflow button to one)
DisplayConstraints displayConstraints =
    new DisplayConstraints.Builder()
        .setMaxButtonsForSlot(CommandButton.SLOT_OVERFLOW, 1)
        .build();
// Resolve media app preferences with constraints
List<CommandButton> resolvedButtons =
    displayConstraints.resolve(mediaButtonPreferences, controller);
// Display buttons in UI
for (CommandButton button : resolvedButtons) {
  generateUiButton(
      /* uiPosition= */ button.slots.get(0),
      /* icon= */ getIconRes(button.icon),
      /* onClick= */ () -> button.executeAction(controller));
}