ক্লায়েন্ট/সার্ভার ডিজাইন সম্পূর্ণ করতে, আপনাকে অবশ্যই একটি অ্যাক্টিভিটি কম্পোনেন্ট তৈরি করতে হবে যাতে আপনার UI কোড, একটি সংশ্লিষ্ট MediaController এবং একটি MediaBrowser থাকে।
MediaBrowser দুটি গুরুত্বপূর্ণ ফাংশন সঞ্চালন করে: এটি একটি MediaBrowserService এর সাথে সংযোগ স্থাপন করে এবং এটি সংযোগ করার পর আপনার UI এর জন্য MediaController তৈরি করে।
দ্রষ্টব্য: MediaBrowser-এর প্রস্তাবিত বাস্তবায়ন হল MediaBrowserCompat
, যা মিডিয়া-কম্প্যাট সমর্থন লাইব্রেরিতে সংজ্ঞায়িত করা হয়েছে। এই পৃষ্ঠা জুড়ে "MediaBrowser" শব্দটি MediaBrowserCompat-এর একটি উদাহরণকে বোঝায়।
মিডিয়া ব্রাউজার সার্ভিসের সাথে সংযোগ করুন
আপনার ক্লায়েন্ট কার্যকলাপ তৈরি করা হলে, এটি MediaBrowserService এর সাথে সংযুক্ত হয়। একটু হ্যান্ডশেক এবং নাচ জড়িত আছে. কার্যকলাপের জীবনচক্র কলব্যাকগুলি নিম্নরূপ পরিবর্তন করুন:
-
onCreate()
একটি MediaBrowserCompat তৈরি করে। আপনার MediaBrowserService এবং MediaBrowserCompat.ConnectionCallback যেটি আপনি সংজ্ঞায়িত করেছেন তার নামে পাস করুন৷ -
onStart()
MediaBrowserService এর সাথে সংযোগ করে। এখানে MediaBrowserCompat.ConnectionCallback-এর যাদু আসে৷ সংযোগটি সফল হলে, onConnect() কলব্যাক মিডিয়া কন্ট্রোলার তৈরি করে, মিডিয়া সেশনের সাথে লিঙ্ক করে, আপনার UI নিয়ন্ত্রণগুলিকে MediaController-এর সাথে লিঙ্ক করে, এবং কলব্যাকগুলি পাওয়ার জন্য নিয়ামককে নিবন্ধন করে৷ মিডিয়া অধিবেশন। -
onResume()
অডিও স্ট্রিম সেট করে যাতে আপনার অ্যাপ ডিভাইসে ভলিউম কন্ট্রোলে সাড়া দেয়। -
onStop()
আপনার MediaBrowser সংযোগ বিচ্ছিন্ন করে এবং MediaController-এর নিবন্ধনমুক্ত করে। আপনার কার্যকলাপ বন্ধ হয়ে গেলে কলব্যাক করুন।
কোটলিন
class MediaPlayerActivity : AppCompatActivity() { private lateinit var mediaBrowser: MediaBrowserCompat override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... // Create MediaBrowserServiceCompat mediaBrowser = MediaBrowserCompat( this, ComponentName(this, MediaPlaybackService::class.java), connectionCallbacks, null // optional Bundle ) } public override fun onStart() { super.onStart() mediaBrowser.connect() } public override fun onResume() { super.onResume() volumeControlStream = AudioManager.STREAM_MUSIC } public override fun onStop() { super.onStop() // (see "stay in sync with the MediaSession") MediaControllerCompat.getMediaController(this)?.unregisterCallback(controllerCallback) mediaBrowser.disconnect() } }
জাভা
public class MediaPlayerActivity extends AppCompatActivity { private MediaBrowserCompat mediaBrowser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... // Create MediaBrowserServiceCompat mediaBrowser = new MediaBrowserCompat(this, new ComponentName(this, MediaPlaybackService.class), connectionCallbacks, null); // optional Bundle } @Override public void onStart() { super.onStart(); mediaBrowser.connect(); } @Override public void onResume() { super.onResume(); setVolumeControlStream(AudioManager.STREAM_MUSIC); } @Override public void onStop() { super.onStop(); // (see "stay in sync with the MediaSession") if (MediaControllerCompat.getMediaController(MediaPlayerActivity.this) != null) { MediaControllerCompat.getMediaController(MediaPlayerActivity.this).unregisterCallback(controllerCallback); } mediaBrowser.disconnect(); } }
MediaBrowserCompat.ConnectionCallback কাস্টমাইজ করুন
যখন আপনার কার্যকলাপ MediaBrowserCompat তৈরি করে, তখন আপনাকে অবশ্যই ConnectionCallback-এর একটি উদাহরণ তৈরি করতে হবে। MediaBrowserService থেকে মিডিয়া সেশন টোকেন পুনরুদ্ধার করতে এর onConnected()
পদ্ধতিটি পরিবর্তন করুন এবং একটি MediaControllerCompat তৈরি করতে টোকেন ব্যবহার করুন।
কন্ট্রোলারে একটি লিঙ্ক সংরক্ষণ করতে সুবিধাজনক পদ্ধতি MediaControllerCompat.setMediaController()
ব্যবহার করুন। এটি মিডিয়া বোতামগুলি পরিচালনা করতে সক্ষম করে। ট্রান্সপোর্ট কন্ট্রোল তৈরি করার সময় কন্ট্রোলার পুনরুদ্ধার করতে এটি আপনাকে MediaControllerCompat.getMediaController()
কল করার অনুমতি দেয়।
নিম্নলিখিত কোড নমুনা দেখায় কিভাবে onConnected()
পদ্ধতি পরিবর্তন করতে হয়।
কোটলিন
private val connectionCallbacks = object : MediaBrowserCompat.ConnectionCallback() { override fun onConnected() { // Get the token for the MediaSession mediaBrowser.sessionToken.also { token -> // Create a MediaControllerCompat val mediaController = MediaControllerCompat( this@MediaPlayerActivity, // Context token ) // Save the controller MediaControllerCompat.setMediaController(this@MediaPlayerActivity, mediaController) } // Finish building the UI buildTransportControls() } override fun onConnectionSuspended() { // The Service has crashed. Disable transport controls until it automatically reconnects } override fun onConnectionFailed() { // The Service has refused our connection } }
জাভা
private final MediaBrowserCompat.ConnectionCallback connectionCallbacks = new MediaBrowserCompat.ConnectionCallback() { @Override public void onConnected() { // Get the token for the MediaSession MediaSessionCompat.Token token = mediaBrowser.getSessionToken(); // Create a MediaControllerCompat MediaControllerCompat mediaController = new MediaControllerCompat(MediaPlayerActivity.this, // Context token); // Save the controller MediaControllerCompat.setMediaController(MediaPlayerActivity.this, mediaController); // Finish building the UI buildTransportControls(); } @Override public void onConnectionSuspended() { // The Service has crashed. Disable transport controls until it automatically reconnects } @Override public void onConnectionFailed() { // The Service has refused our connection } };
মিডিয়া কন্ট্রোলারের সাথে আপনার UI সংযুক্ত করুন
উপরের ConnectionCallback নমুনা কোডে, আপনার UI বের করতে buildTransportControls()
এ একটি কল অন্তর্ভুক্ত করে। প্লেয়ারকে নিয়ন্ত্রণ করে এমন UI উপাদানগুলির জন্য আপনাকে onClickListeners সেট করতে হবে। প্রতিটির জন্য উপযুক্ত MediaControllerCompat.TransportControls
পদ্ধতি বেছে নিন।
প্রতিটি বোতামের জন্য একটি onClickListener সহ আপনার কোডটি এরকম কিছু দেখাবে:
কোটলিন
fun buildTransportControls() { val mediaController = MediaControllerCompat.getMediaController(this@MediaPlayerActivity) // Grab the view for the play/pause button playPause = findViewById<ImageView>(R.id.play_pause).apply { setOnClickListener { // Since this is a play/pause button, you'll need to test the current state // and choose the action accordingly val pbState = mediaController.playbackState.state if (pbState == PlaybackStateCompat.STATE_PLAYING) { mediaController.transportControls.pause() } else { mediaController.transportControls.play() } } } // Display the initial state val metadata = mediaController.metadata val pbState = mediaController.playbackState // Register a Callback to stay in sync mediaController.registerCallback(controllerCallback) }
জাভা
void buildTransportControls() { // Grab the view for the play/pause button playPause = (ImageView) findViewById(R.id.play_pause); // Attach a listener to the button playPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Since this is a play/pause button, you'll need to test the current state // and choose the action accordingly int pbState = MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getPlaybackState().getState(); if (pbState == PlaybackStateCompat.STATE_PLAYING) { MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getTransportControls().pause(); } else { MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getTransportControls().play(); } }); MediaControllerCompat mediaController = MediaControllerCompat.getMediaController(MediaPlayerActivity.this); // Display the initial state MediaMetadataCompat metadata = mediaController.getMetadata(); PlaybackStateCompat pbState = mediaController.getPlaybackState(); // Register a Callback to stay in sync mediaController.registerCallback(controllerCallback); } }
ট্রান্সপোর্ট কন্ট্রোল পদ্ধতিগুলি আপনার পরিষেবার মিডিয়া সেশনে কলব্যাক পাঠায়। নিশ্চিত করুন যে আপনি প্রতিটি নিয়ন্ত্রণের জন্য একটি সংশ্লিষ্ট MediaSessionCompat.Callback
পদ্ধতি সংজ্ঞায়িত করেছেন৷
মিডিয়া সেশনের সাথে সুসংগত থাকুন
UI এর প্লেব্যাকস্টেট এবং মেটাডেটা দ্বারা বর্ণিত মিডিয়া সেশনের বর্তমান অবস্থা প্রদর্শন করা উচিত। আপনি যখন ট্রান্সপোর্ট কন্ট্রোল তৈরি করেন, তখন আপনি সেশনের বর্তমান অবস্থা ধরতে পারেন, এটি আপনার UI-তে প্রদর্শন করতে পারেন এবং রাজ্য এবং এর উপলব্ধ ক্রিয়াগুলির উপর ভিত্তি করে পরিবহন নিয়ন্ত্রণগুলি সক্ষম এবং অক্ষম করতে পারেন৷
মিডিয়া সেশন থেকে কলব্যাক পেতে প্রতিবার যখন তার অবস্থা বা মেটাডেটা পরিবর্তন হয়, একটি MediaControllerCompat.Callback
সংজ্ঞায়িত করুন, এই দুটি পদ্ধতির সাথে:
কোটলিন
private var controllerCallback = object : MediaControllerCompat.Callback() { override fun onMetadataChanged(metadata: MediaMetadataCompat?) {} override fun onPlaybackStateChanged(state: PlaybackStateCompat?) {} }
জাভা
MediaControllerCompat.Callback controllerCallback = new MediaControllerCompat.Callback() { @Override public void onMetadataChanged(MediaMetadataCompat metadata) {} @Override public void onPlaybackStateChanged(PlaybackStateCompat state) {} };
আপনি যখন ট্রান্সপোর্ট কন্ট্রোল তৈরি করেন তখন কলব্যাক রেজিস্টার করুন ( buildTransportControls()
পদ্ধতি দেখুন) এবং অ্যাক্টিভিটি বন্ধ হয়ে গেলে (অ্যাক্টিভিটি এর onStop()
লাইফসাইকেল পদ্ধতিতে) এটি নিবন্ধনমুক্ত করুন।
মিডিয়া সেশন ধ্বংস হয়ে গেলে সংযোগ বিচ্ছিন্ন করুন
মিডিয়া সেশন অবৈধ হয়ে গেলে, onSessionDestroyed()
কলব্যাক জারি করা হয়। যখন এটি ঘটে, সেশনটি MediaBrowserService
এর জীবদ্দশায় আবার কার্যকরী হতে পারে না। যদিও MediaBrowser
এর সাথে সম্পর্কিত ফাংশনগুলি কাজ চালিয়ে যেতে পারে, একজন ব্যবহারকারী একটি ধ্বংস হওয়া মিডিয়া সেশন থেকে প্লেব্যাক দেখতে বা নিয়ন্ত্রণ করতে পারে না, যা সম্ভবত আপনার অ্যাপ্লিকেশনটির মান হ্রাস করবে।
অতএব, সেশনটি ধ্বংস হয়ে গেলে, disconnect()
কল করে আপনাকে MediaBrowserService
থেকে সংযোগ বিচ্ছিন্ন করতে হবে । এটি নিশ্চিত করে যে ব্রাউজার পরিষেবাটির কোনও আবদ্ধ ক্লায়েন্ট নেই এবং OS দ্বারা ধ্বংস করা যেতে পারে ৷ আপনি যদি পরবর্তীতে MediaBrowserService
এ পুনরায় সংযোগ করতে চান (উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটি মিডিয়া অ্যাপের সাথে একটি অবিরাম সংযোগ বজায় রাখতে চায়), পুরানোটি পুনরায় ব্যবহার না করে MediaBrowser
এর একটি নতুন উদাহরণ তৈরি করুন।
নিম্নলিখিত কোড স্নিপেট একটি কলব্যাক বাস্তবায়ন প্রদর্শন করে যা মিডিয়া সেশনটি ধ্বংস হয়ে গেলে ব্রাউজার পরিষেবা থেকে সংযোগ বিচ্ছিন্ন হয়ে যায়:
কোটলিন
private var controllerCallback = object : MediaControllerCompat.Callback() { override fun onSessionDestroyed() { mediaBrowser.disconnect() // maybe schedule a reconnection using a new MediaBrowser instance } }
জাভা
MediaControllerCompat.Callback controllerCallback = new MediaControllerCompat.Callback() { @Override public void onSessionDestroyed() { mediaBrowser.disconnect(); // maybe schedule a reconnection using a new MediaBrowser instance } };