CastPlayer হলো জেটপ্যাক মিডিয়া৩ প্লেয়ারের একটি বাস্তবায়ন, যা লোকাল প্লেব্যাক এবং দূরবর্তী কাস্ট-সক্ষম ডিভাইসে কাস্টিং উভয়ই সমর্থন করে। CastPlayer আপনার অ্যাপে কাস্ট কার্যকারিতা যোগ করা সহজ করে এবং লোকাল ও রিমোট প্লেব্যাকের মধ্যে নির্বিঘ্নে পরিবর্তন করার জন্য সমৃদ্ধ বৈশিষ্ট্য প্রদান করে। এই নির্দেশিকাটি আপনাকে দেখাবে কীভাবে আপনার মিডিয়া অ্যাপে CastPlayer একীভূত করবেন।
অন্যান্য প্ল্যাটফর্মের সাথে Cast সংযুক্ত করতে, Cast SDK দেখুন।
কাস্ট-সক্ষম একটি ডিভাইস নিন
CastPlayer পরীক্ষা করার জন্য আপনার একটি কাস্ট-সক্ষম ডিভাইস প্রয়োজন। এর মধ্যে রয়েছে অ্যান্ড্রয়েড টিভি, ক্রোমকাস্ট, স্মার্ট স্পিকার এবং স্মার্ট ডিসপ্লে। ডিসকভারির জন্য আপনার ডিভাইসটি যে মোবাইলের সাথে সেট আপ করা আছে এবং সংযুক্ত আছে, তা যাচাই করে নিন।
বিল্ড নির্ভরতা যোগ করুন
CastPlayer ব্যবহার শুরু করতে, আপনার অ্যাপ মডিউলের build.gradle ফাইলে AndroidX Media3 এবং CastPlayer ডিপেন্ডেন্সিগুলো যোগ করুন।
কোটলিন
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 এর আচরণ কনফিগার করার জন্য একটি অপশনস প্রোভাইডার প্রয়োজন। একটি বেসিক সেটআপের জন্য, আপনি আপনার AndroidManifest.xml ফাইলে DefaultCastOptionsProvider যোগ করে এটি ব্যবহার করতে পারেন। এটি ডিফল্ট রিসিভার অ্যাপ্লিকেশন সহ ডিফল্ট সেটিংস ব্যবহার করে।
<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 যোগ করলে, সিস্টেম UI অ্যাপ অ্যাক্টিভিটি না খুলেই নেটওয়ার্কে কাস্ট-সক্ষম ডিভাইসগুলো খুঁজে বের করতে এবং মিডিয়া রি-রুট করতে পারে। উদাহরণস্বরূপ, একজন ব্যবহারকারী মিডিয়া নোটিফিকেশন থেকেই আপনার অ্যাপের মিডিয়া প্লে করা ডিভাইস পরিবর্তন করতে পারেন।
<application>
...
<receiver android:name="androidx.mediarouter.media.MediaTransferReceiver" />
...
</application>
একটি কাস্টপ্লেয়ার তৈরি করুন
Cast-এর মাধ্যমে রিমোট প্লেব্যাকের জন্য, ব্যবহারকারী যখন আপনার অ্যাপের কোনো Activity-র সাথে ইন্টারঅ্যাক্ট করছেন না, তখনও আপনার অ্যাপের প্লেব্যাক পরিচালনা করার ক্ষমতা থাকা উচিত, যেমন সিস্টেম মিডিয়া নোটিফিকেশনের মাধ্যমে। এই কারণে, আপনার ExoPlayer (লোকাল প্লেব্যাকের জন্য) এবং CastPlayer (রিমোট প্লেব্যাকের জন্য) ইনস্ট্যান্সগুলো MediaSessionService বা MediaLibraryService-এর মতো কোনো সার্ভিসে তৈরি করা উচিত। প্রথমে, আপনার ExoPlayer ইনস্ট্যান্স তৈরি করুন এবং তারপর আপনার CastPlayer ইনস্ট্যান্স তৈরি করার সময়, ExoPlayer লোকাল প্লেয়ার ইনস্ট্যান্স হিসেবে সেট করুন। এরপর আপনি মিডিয়া নোটিফিকেশন বা লক স্ক্রিন নোটিফিকেশন থেকে আপনার মোবাইল এবং Cast-সক্ষম ডিভাইসের মধ্যে মিডিয়া প্লেব্যাক পরিবর্তন করতে পারবেন। যখন আউটপুট রুট লোকাল থেকে রিমোট বা রিমোট থেকে লোকালে পরিবর্তিত হয়, তখন প্লেয়ার স্থানান্তর পরিচালনা করার জন্য Media3 তার Output Switcher ফিচারটি ব্যবহার করে।

কোটলিন
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() }
জাভা
@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(); }
UI উপাদান যোগ করুন
আপনার অ্যাপের UI-তে একটি MediaRouteButton যোগ করুন। MediaRouteButton টিতে ট্যাপ করলে একটি ডায়ালগ বক্স খোলে, যেখানে নেটওয়ার্কে উপলব্ধ কাস্ট-সক্ষম ডিভাইসগুলির একটি তালিকা প্রদর্শিত হয়। ব্যবহারকারী যখন কোনো ডিভাইস নির্বাচন করেন, তখন মিডিয়া প্লেব্যাক মোবাইল থেকে নির্বাচিত রিসিভার ডিভাইসে স্থানান্তরিত হয়। এই বিভাগে দেখানো হয়েছে কীভাবে বাটনটি যোগ করতে হয় এবং লোকাল ও রিমোট ডিভাইসের মধ্যে প্লেব্যাক স্থানান্তরিত হলে আপনার UI আপডেট করার জন্য ইভেন্টগুলি শুনতে হয়।
MediaRouteButton সেট করুন
আপনার অ্যাক্টিভিটির UI-তে MediaRouteButton যোগ করার চারটি উপায় আছে। সেরা উপায়টি আপনার অ্যাপের ডিজাইন এবং প্রয়োজনের উপর নির্ভর করে।
- UI কম্পোজ করুন : একটি কম্পোজেবল বাটন যোগ করুন।
- ভিউ UI :
- অ্যাপ বার মেনুতে বাটনটি যোগ করুন।
-
PlayerViewভিতরে বাটনটি যোগ করুন। - বাটনটিকে একটি স্ট্যান্ডার্ড
Viewহিসেবে যোগ করুন।

প্লেয়ারে একটি কম্পোজেবল MediaRouteButton যোগ করুন
আপনি আপনার প্লেয়ারের UI-তে MediaRouteButton Composable-টি যোগ করতে পারেন। আরও তথ্যের জন্য, 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- এর UI কন্ট্রোলগুলোর মধ্যেই সরাসরি MediaRouteButton যোগ করতে পারেন। আপনার PlayerView এর প্লেয়ার হিসেবে MediaController সেট করার পর, প্লেয়ারে কাস্ট বাটনটি প্রদর্শন করার জন্য একটি MediaRouteButtonViewProvider প্রদান করুন।
কোটলিন
override fun onStart() { super.onStart() playerView.player = mediaController playerView.setMediaRouteButtonViewProvider(MediaRouteButtonViewProvider()) }
জাভা
@Override public void onStart() { super.onStart(); playerView.setPlayer(mediaController); playerView.setMediaRouteButtonViewProvider(new MediaRouteButtonViewProvider()); }
অ্যাপ বার মেনুতে MediaRouteButton যোগ করুন
অ্যাপ বার মেনুতে একটি MediaRouteButton সেট আপ করতে, একটি XML মেনু তৈরি করুন এবং আপনার 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>
কোটলিন
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 }
জাভা
@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 একটি ভিউ হিসেবে যোগ করুন
আপনি আপনার অ্যাক্টিভিটির 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 ব্যবহার করুন।
কোটলিন
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) findViewById<MediaRouteButton>(R.id.media_route_button)?.also { val unused = MediaRouteButtonFactory.setUpMediaRouteButton(context, it) } }
জাভা
@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 একটি Player.Listener তৈরি করুন। যখন playbackType PLAYBACK_TYPE_LOCAL এবং PLAYBACK_TYPE_REMOTE এর মধ্যে পরিবর্তিত হয়, তখন আপনি প্রয়োজন অনুযায়ী আপনার UI সামঞ্জস্য করতে পারেন। মেমরি লিক প্রতিরোধ করতে এবং লিসেনারের কার্যকলাপ শুধুমাত্র আপনার অ্যাপ দৃশ্যমান থাকাকালীন সীমাবদ্ধ রাখতে, onStart এ লিসেনারটি রেজিস্টার করুন এবং onStop এ এটি আনরেজিস্টার করুন।
কোটলিন
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) }
জাভা
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); }
প্লেব্যাক ইভেন্ট শোনা এবং সেগুলিতে সাড়া দেওয়া সম্পর্কে আরও তথ্যের জন্য, প্লেয়ার ইভেন্ট গাইডটি দেখুন।