CastPlayer का इस्तेमाल शुरू करना

CastPlayer, Jetpack Media3 Player का एक ऐसा वर्शन है जो स्थानीय तौर पर वीडियो चलाने के साथ-साथ, कास्ट करने की सुविधा वाले रिमोट डिवाइस पर भी वीडियो चलाने की सुविधा देता है. CastPlayer की मदद से, आपके ऐप्लिकेशन में कास्ट करने की सुविधा को आसानी से जोड़ा जा सकता है. साथ ही, यह स्थानीय और रिमोट डिवाइस पर वीडियो चलाने की सुविधा के बीच आसानी से स्विच करने के लिए कई सुविधाएं उपलब्ध कराता है. इस गाइड में, मीडिया ऐप्लिकेशन में CastPlayer को इंटिग्रेट करने का तरीका बताया गया है.

कास्ट करने की सुविधा को अन्य प्लैटफ़ॉर्म के साथ इंटिग्रेट करने के लिए, Cast SDK देखें.

कास्ट करने की सुविधा वाला डिवाइस पाना

CastPlayer को टेस्ट करने के लिए, आपको कास्ट करने की सुविधा वाले डिवाइस की ज़रूरत होगी. इसके लिए, Android TV, Chromecast, स्मार्ट स्पीकर, और स्मार्ट डिसप्ले का इस्तेमाल किया जा सकता है. पक्का करें कि आपका डिवाइस सेट अप हो और वह उसी वाई-फ़ाई नेटवर्क से कनेक्ट हो जिससे आपका डेवलपमेंट मोबाइल कनेक्ट है.

बिल्ड डिपेंडेंसी जोड़ना

CastPlayer का इस्तेमाल शुरू करने के लिए, अपने ऐप्लिकेशन मॉड्यूल की build.gradle फ़ाइल में AndroidX Media3 और CastPlayer डिपेंडेंसी जोड़ें.

Kotlin

implementation("androidx.media3:media3-exoplayer:1.10.0")
implementation("androidx.media3:media3-ui:1.10.0")
implementation("androidx.media3:media3-session:1.10.0")
implementation("androidx.media3:media3-cast:1.10.0")

शानदार

implementation "androidx.media3:media3-exoplayer:1.10.0"
implementation "androidx.media3:media3-ui:1.10.0"
implementation "androidx.media3:media3-session:1.10.0"
implementation "androidx.media3:media3-cast:1.10.0"

CastPlayer को कॉन्फ़िगर करना

CastPlayer को कॉन्फ़िगर करने के लिए, AndroidManifest.xml फ़ाइल को विकल्पों के प्रोवाइडर के साथ अपडेट करें.

विकल्पों का प्रोवाइडर

CastPlayer को अपने व्यवहार को कॉन्फ़िगर करने के लिए, विकल्पों के प्रोवाइडर की ज़रूरत होती है. बेसिक सेटअप के लिए, DefaultCastOptionsProvider को अपनी AndroidManifest.xml फ़ाइल में जोड़कर, इसका इस्तेमाल किया जा सकता है. इससे डिफ़ॉल्ट सेटिंग का इस्तेमाल किया जाता है. इसमें, डिफ़ॉल्ट रिसीवर ऐप्लिकेशन भी शामिल है.

<application>
  ...
  <meta-data
    android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
    android:value="androidx.media3.cast.DefaultCastOptionsProvider" />
  ...
</application>

कॉन्फ़िगरेशन को पसंद के मुताबिक बनाने के लिए, अपना कस्टम OptionsProvider लागू करें. इसे लागू करने का तरीका जानने के लिए, CastOptions गाइड देखें.

मीडिया ट्रांसफ़र के लिए रिसीवर जोड़ना

मेनिफ़ेस्ट में MediaTransferReceiver जोड़ने से, सिस्टम यूज़र इंटरफ़ेस (यूआई) को नेटवर्क पर कास्ट करने की सुविधा वाले डिवाइसों का पता चलता है. साथ ही, ऐप्लिकेशन की गतिविधि खोले बिना, मीडिया को दूसरे डिवाइस पर भेजा जा सकता है. उदाहरण के लिए, कोई उपयोगकर्ता मीडिया सूचना से, आपके ऐप्लिकेशन का मीडिया चलाने वाले डिवाइस को बदल सकता है.

<application>
  ...
  <receiver android:name="androidx.mediarouter.media.MediaTransferReceiver" />
  ...
</application>

CastPlayer बनाना

कास्ट करने की सुविधा का इस्तेमाल करके, रिमोट डिवाइस पर वीडियो चलाने के लिए, आपके ऐप्लिकेशन को वीडियो चलाने की सुविधा को मैनेज करना चाहिए. भले ही, उपयोगकर्ता आपके ऐप्लिकेशन की किसी गतिविधि के साथ इंटरैक्ट न कर रहा हो. जैसे, सिस्टम मीडिया सूचना के ज़रिए. इसलिए, आपको ExoPlayer (स्थानीय तौर पर वीडियो चलाने के लिए) और CastPlayer (रिमोट डिवाइस पर वीडियो चलाने के लिए) के इंस्टेंस, किसी सेवा में बनाने चाहिए. जैसे, MediaSessionService या MediaLibraryService. सबसे पहले, ExoPlayer का इंस्टेंस बनाएं. इसके बाद, आपके CastPlayer का इंस्टेंस बनाते समय, ExoPlayer को स्थानीय प्लेयर इंस्टेंस के तौर पर सेट करें. इसके बाद, मीडिया सूचना या लॉक स्क्रीन पर दिखने वाली सूचना से, अपने फ़ोन और कास्ट करने की सुविधा वाले डिवाइस के बीच मीडिया चलाने की सुविधा को स्विच किया जा सकता है. जब आउटपुट का रूट स्थानीय से रिमोट या रिमोट से स्थानीय में बदलता है, तो Media3, प्लेयर ट्रांसफ़र को हैंडल करने के लिए, आउटपुट स्विचर सुविधा का इस्तेमाल करता है.

सूचनाओं में आउटपुट स्विचर का यूज़र इंटरफ़ेस (यूआई) दिखाने वाला स्क्रीनशॉट.
पहली इमेज: (a) मीडिया सूचना पर डिवाइस चिप (b) डिवाइस चिप पर टैप करने पर, कास्ट करने की सुविधा वाले डिवाइस दिखते हैं (c) लॉक स्क्रीन पर दिखने वाली सूचना पर डिवाइस चिप

Kotlin

override fun onCreate() {
  super.onCreate()

  val exoPlayer = ExoPlayer.Builder(context).build()
  val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()

  mediaSession = MediaSession.Builder(context, castPlayer).build()
}

Java

@Override
public void onCreate() {
  super.onCreate();

  ExoPlayer exoPlayer = new ExoPlayer.Builder(context).build();
  CastPlayer castPlayer = new CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build();

  mediaSession =
      new MediaSession.Builder(/* context= */ context, /* player= */ castPlayer).build();
}

यूज़र इंटरफ़ेस (यूआई) एलिमेंट जोड़ना

अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में, MediaRouteButton जोड़ें. MediaRouteButton पर टैप करने से, एक डायलॉग बॉक्स खुलता है. इसमें, नेटवर्क पर कास्ट करने की सुविधा वाले उपलब्ध डिवाइसों की सूची दिखती है. जब उपयोगकर्ता किसी डिवाइस को चुनता है, तो मीडिया चलाने की सुविधा, फ़ोन से चुने गए रिसीवर डिवाइस पर ट्रांसफ़र हो जाती है. इस सेक्शन में, बटन जोड़ने और स्थानीय और रिमोट डिवाइसों के बीच वीडियो चलाने की सुविधा स्विच होने पर, यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए इवेंट सुनने का तरीका बताया गया है.

MediaRouteButton सेट करना

अपनी गतिविधि के यूज़र इंटरफ़ेस (यूआई) में, MediaRouteButton को चार तरीकों से जोड़ा जा सकता है. सबसे सही विकल्प, आपके ऐप्लिकेशन के डिज़ाइन और ज़रूरी शर्तों पर निर्भर करता है.

  • Compose यूज़र इंटरफ़ेस (यूआई): बटन कंपोज़ेबल जोड़ें.
  • Views यूज़र इंटरफ़ेस (यूआई):
    • ऐप्लिकेशन बार मेन्यू में बटन जोड़ें.
    • PlayerView में बटन जोड़ें.
    • बटन को स्टैंडर्ड View के तौर पर जोड़ें.
यूज़र इंटरफ़ेस (यूआई) में MediaRouteButton को दिखाने वाला स्क्रीनशॉट.
दूसरी इमेज: (a) मेन्यू बार में MediaRouteButton, (b) View के तौर पर, (c) PlayerView में, और (d) कास्ट करने की सुविधा वाले डिवाइसों का डायलॉग बॉक्स.

प्लेयर में, कंपोज़ेबल MediaRouteButton जोड़ना

प्लेयर के यूज़र इंटरफ़ेस (यूआई) में, MediaRouteButton कंपोज़ेबल जोड़ा जा सकता है. ज़्यादा जानकारी के लिए, Compose गाइड देखें.

@Composable
fun PlayerComposeView(player: Player, modifier: Modifier = Modifier) {
  var controlsVisible by remember { mutableStateOf(false) }

  Box(
    modifier = modifier.clickable { controlsVisible = true },
    contentAlignment = Alignment.Center,
  ) {
    PlayerSurface(player = player, modifier = modifier)
    AnimatedVisibility(visible = controlsVisible, enter = fadeIn(), exit = fadeOut()) {
      Box(modifier = Modifier.fillMaxSize()) {
        MediaRouteButton(modifier = Modifier.align(Alignment.TopEnd))
        PrimaryControls(player = player, modifier = Modifier.align(Alignment.Center))
      }
    }
  }
}

@Composable
fun PrimaryControls(player: Player, modifier: Modifier = Modifier) {
  // ...
}

PlayerView में MediaRouteButton जोड़ना

PlayerView के यूज़र इंटरफ़ेस (यूआई) कंट्रोल में, सीधे MediaRouteButton जोड़ा जा सकता है. MediaController को आपके PlayerView के लिए प्लेयर के तौर पर सेट करने के बाद, Player पर कास्ट बटन दिखाने के लिए, MediaRouteButtonViewProvider उपलब्ध कराएं.

Kotlin

override fun onStart() {
  super.onStart()

  playerView.player = mediaController
  playerView.setMediaRouteButtonViewProvider(MediaRouteButtonViewProvider())
}

Java

@Override
public void onStart() {
  super.onStart();

  playerView.setPlayer(mediaController);
  playerView.setMediaRouteButtonViewProvider(new MediaRouteButtonViewProvider());
}

ऐप्लिकेशन बार मेन्यू में MediaRouteButton जोड़ना

ऐप्लिकेशन बार मेन्यू में MediaRouteButton सेट अप करने के लिए, एक एक्सएमएल मेन्यू बनाएं और अपनी Activity में onCreateOptionsMenu को बदलें.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto">
  <item android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    app:showAsAction="always"
    app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"/>
</menu>

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
  // ...
  menuInflater.inflate(R.menu.sample_media_route_button_menu, menu)
  val menuItemFuture: ListenableFuture<MenuItem> =
    MediaRouteButtonFactory.setUpMediaRouteButton(context, menu, R.id.media_route_menu_item)
  Futures.addCallback(
    menuItemFuture,
    object : FutureCallback<MenuItem> {
      override fun onSuccess(menuItem: MenuItem?) {
        // Do something with the menu item.
      }

      override fun onFailure(t: Throwable) {
        // Handle the failure.
      }
    },
    executor,
  )
  // ...
  return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  // ...
  getMenuInflater().inflate(R.menu.sample_media_route_button_menu, menu);
  ListenableFuture<MenuItem> menuItemFuture =
      MediaRouteButtonFactory.setUpMediaRouteButton(context, menu, R.id.media_route_menu_item);
  Futures.addCallback(
      menuItemFuture,
      new FutureCallback<MenuItem>() {
        @Override
        public void onSuccess(MenuItem menuItem) {
          // Do something with the menu item.
        }

        @Override
        public void onFailure(Throwable t) {
          // Handle the failure.
        }
      },
      executor);
  // ...
  return true;
}

MediaRouteButton को View के तौर पर जोड़ना

अपनी गतिविधि के layout.xml में, MediaRouteButton सेट अप किया जा सकता है.

  <androidx.mediarouter.app.MediaRouteButton
      android:id="@+id/media_route_button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:mediaRouteButtonTint="@android:color/white" />

MediaRouteButton का सेटअप पूरा करने के लिए, अपनी Activity के कोड में, Media3 Cast MediaRouteButtonFactory का इस्तेमाल करें.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

  findViewById<MediaRouteButton>(R.id.media_route_button)?.also {
    val unused = MediaRouteButtonFactory.setUpMediaRouteButton(context, it)
  }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // ...
  MediaRouteButton button = findViewById(R.id.media_route_button);
  ListenableFuture<Void> setUpFuture =
      MediaRouteButtonFactory.setUpMediaRouteButton(context, button);
}

Activity Listener

मीडिया चलाने की जगह में होने वाले बदलावों को सुनने के लिए, अपनी Activity में Player.Listener बनाएं. जब playbackType, PLAYBACK_TYPE_LOCAL और PLAYBACK_TYPE_REMOTE के बीच बदलता है, तो ज़रूरत के हिसाब से अपने यूज़र इंटरफ़ेस (यूआई) को अडजस्ट किया जा सकता है. मेमोरी लीक होने से बचाने और लिसनर की गतिविधि को सिर्फ़ तब तक सीमित रखने के लिए, जब आपका ऐप्लिकेशन दिखता है, तो लिसनर को onStart में रजिस्टर करें और onStop में अनरजिस्टर करें:

Kotlin

private val playerListener: Player.Listener =
  object : Player.Listener {
    override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
      if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_LOCAL) {
        // Add UI changes for local playback.
      } else if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_REMOTE) {
        // Add UI changes for remote playback.
      }
    }
  }

override fun onStart() {
  super.onStart()
  mediaController.addListener(playerListener)
}

override fun onStop() {
  super.onStop()
  mediaController.removeListener(playerListener)
}

Java

private final Player.Listener playerListener =
    new Player.Listener() {
      @Override
      public void onDeviceInfoChanged(DeviceInfo deviceInfo) {
        if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_LOCAL) {
          // Add UI changes for local playback.
        } else if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_REMOTE) {
          // Add UI changes for remote playback.
        }
      }
    };

@Override
protected void onStart() {
  super.onStart();
  mediaController.addListener(playerListener);
}

@Override
protected void onStop() {
  super.onStop();
  mediaController.removeListener(playerListener);
}

वीडियो चलाने से जुड़े इवेंट सुनने और उनके जवाब देने के बारे में ज़्यादा जानने के लिए, प्लेयर इवेंट गाइड देखें.