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