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