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

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

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

CastPlayer को डिपेंडेंसी के तौर पर जोड़ना

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

Kotlin

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

Groovy

implementation "androidx.media3:media3-exoplayer:1.9.0-alpha01"
implementation "androidx.media3:media3-ui:1.9.0-alpha01"
implementation "androidx.media3:media3-session:1.9.0-alpha01"
implementation "androidx.media3:media3-cast:1.9.0-alpha01"

Jetpack Media के रिलीज़ नोट देखें, ताकि आपको ऐल्फ़ा वर्शन की नई रिलीज़ के बारे में पता चल सके. इससे CastPlayer को अपने ऐप्लिकेशन में इंटिग्रेट किया जा सकेगा. सभी मॉड्यूल एक ही वर्शन के होने चाहिए.

उपलब्ध लाइब्रेरी मॉड्यूल के बारे में ज़्यादा जानने के लिए, Google Maven AndroidX Media3 पेज देखें.

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

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

विकल्प देने वाली कंपनी

CastPlayer के लिए, विकल्पों की जानकारी देने वाली कंपनी को इसके व्यवहार को कॉन्फ़िगर करना होता है. बेसिक सेटअप के लिए, 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 प्लेयर ट्रांसफ़र को मैनेज कर पाएगा. ऐसा तब होगा, जब आउटपुट रूट को लोकल से रिमोट या रिमोट से लोकल में बदला जाएगा.

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 कंपोज़ेबल जोड़ा जा सकता है. ज़्यादा जानकारी के लिए, लिखें गाइड देखें.

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 के यूज़र इंटरफ़ेस (यूआई) कंट्रोल में जोड़ा जा सकता है. 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());
}

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

इस तरीके से, ऐप्लिकेशन बार मेन्यू में मीडिया रूट बटन सेट अप किया जाता है. इस तरह के बटन को दिखाने के लिए, मेनिफ़ेस्ट फ़ाइल और Activity, दोनों को अपडेट करना ज़रूरी है.

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

मीडिया रूट बटन को व्यू के तौर पर जोड़ें

इसके अलावा, अपनी गतिविधि के layout.xml में MediaRouteButton सेट अप किया जा सकता है. 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);
}

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