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

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

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

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

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

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

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

Kotlin

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

Groovy

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

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

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

CastPlayer बनाना

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

सूचनाओं में आउटपुट स्विचर यूज़र इंटरफ़ेस (यूआई) को दिखाने वाला स्क्रीनशॉट.
पहली इमेज: (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 पर टैप करने से, एक डायलॉग बॉक्स खुलता है. इसमें नेटवर्क पर Cast की सुविधा वाले उपलब्ध डिवाइसों की सूची दिखती है. जब उपयोगकर्ता कोई डिवाइस चुनता है, तो मीडिया चलाने की सुविधा को मोबाइल से चुने गए रिसीवर डिवाइस पर ट्रांसफ़र कर दिया जाता है. इस सेक्शन में, बटन जोड़ने का तरीका बताया गया है. साथ ही, यह भी बताया गया है कि जब वीडियो चलाने की सुविधा स्थानीय और रिमोट डिवाइसों के बीच स्विच होती है, तब यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए इवेंट कैसे सुने जाते हैं.

MediaRouteButton सेट करना

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

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

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

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

Kotlin

import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.media3.cast.MediaRouteButton

@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 जोड़ा जा सकता है. PlayerView के लिए MediaController को प्लेयर के तौर पर सेट करने के बाद, प्लेयर पर कास्ट बटन दिखाने के लिए 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)
    ...
}

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);
    ...
}

MediaRouteButton को व्यू के तौर पर जोड़ना

गतिविधि के 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) {
    ...
    MediaRouteButton button = findViewById(R.id.media_route_button);
    ListenableFuture<Void> setUpFuture =
        MediaRouteButtonFactory.setUpMediaRouteButton(context, button);
}

गतिविधि लिसनर

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

Kotlin

import androidx.media3.common.DeviceInfo
import androidx.media3.common.Player

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

import androidx.media3.common.DeviceInfo;
import androidx.media3.common.Player;

private 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);
}

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