क्लाइंट/सर्वर के डिज़ाइन को पूरा करने के लिए, आपको एक ऐसा ऐक्टिविटी कॉम्पोनेंट बनाना होगा जिसमें आपका यूज़र इंटरफ़ेस (यूआई) कोड, उससे जुड़ा हुआ MediaController, और एक MediaBrowser शामिल हो.
MediaBrowser दो अहम काम करता है: यह MediaBrowserService से कनेक्ट होता है और कनेक्ट करने पर आपके यूज़र इंटरफ़ेस (यूआई) के लिए MediaController बनाता है.
ध्यान दें: MediaBrowser का इस्तेमाल करने के लिए सुझाया गया तरीका
MediaBrowserCompat
है,
जो
Media-Compat की सहायता लाइब्रेरी.
इस पूरे पेज पर "MediaBrowser" शब्द किसी इंस्टेंस के बारे में बताता है
के MediaBrowserCompat.
MediaBrowserService से कनेक्ट करें
जब आपकी क्लाइंट गतिविधि बन जाती है, तो वह MediaBrowserService से कनेक्ट हो जाती है. वीडियो में हैंडशेक और डांस के वीडियो दिखाए जाते हैं. गतिविधि के लाइफ़साइकल कॉलबैक में, इस तरह बदलाव करें:
onCreate()
एक MediaBrowserCompat बनाता है. अपने MediaBrowserService और MediaBrowserCompat.ConnectionCallback के नाम को पास करें.onStart()
, MediaBrowserService से कनेक्ट होता है. यहां MediaBrowserCompat.ConnectionCallback का इस्तेमाल करके कमाई करने का जादू काम कर सकता है. कनेक्शन पूरा होने पर, onConnect() कॉलबैक मीडिया कंट्रोलर बनाता है, उसे मीडिया सेशन से जोड़ता है, और आपके यूज़र इंटरफ़ेस (यूआई) कंट्रोल को MediaController से जोड़ता है. साथ ही, मीडिया सेशन से कॉलबैक पाने के लिए, कंट्रोलर को रजिस्टर करता है.onResume()
ऑडियो स्ट्रीम सेट करता है, ताकि आपका ऐप्लिकेशन डिवाइस के वॉल्यूम कंट्रोल का जवाब दे.- आपकी गतिविधि बंद होने पर,
onStop()
आपके MediaBrowser को डिसकनेक्ट करता है और MediaController.Callback को अनलिंक कर देता है.
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
}
};
अपने यूज़र इंटरफ़ेस (यूआई) को मीडिया कंट्रोलर से कनेक्ट करें
ऊपर दिए गए कनेक्शन कॉलबैक सैंपल कोड में, आपके यूज़र इंटरफ़ेस (यूआई) को बेहतर बनाने के लिए, buildTransportControls()
को किया गया कॉल शामिल है. आपको प्लेयर को कंट्रोल करने वाले यूज़र इंटरफ़ेस (यूआई) एलिमेंट के लिए 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);
}
}
TransportControls के तरीके आपकी सेवा के मीडिया सेशन में कॉलबैक भेजते हैं. पक्का करें कि आपने
हर कंट्रोल के लिए MediaSessionCompat.Callback
तरीका.
मीडिया सेशन के साथ सिंक में रहें
यूज़र इंटरफ़ेस (यूआई) को मीडिया सेशन की मौजूदा स्थिति दिखानी चाहिए, जैसा कि उसके प्लेबैक स्टेट और मेटाडेटा में बताया गया है. ट्रांसपोर्ट कंट्रोल बनाते समय, आपके पास सेशन की मौजूदा स्थिति जानने और उसे अपने यूज़र इंटरफ़ेस (यूआई) में दिखाने का विकल्प होता है. साथ ही, स्थिति और उपलब्ध कार्रवाइयों के आधार पर, ट्रांसपोर्ट कंट्रोल चालू और बंद किए जा सकते हैं.
मीडिया सेशन की स्थिति या मेटाडेटा में हर बार बदलाव होने पर कॉलबैक पाने के लिए,
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
से संबंधित शायद काम करना जारी रखे, क्योंकि उपयोगकर्ता इसे देख या कंट्रोल नहीं कर सकता
खत्म हो चुके मीडिया सेशन से वीडियो चलाना. इसकी वजह से हो सकता है कि
आपका ऐप्लिकेशन.
इसलिए, सेशन खत्म होने पर, आपको
कॉल करके MediaBrowserService
disconnect()
.
इससे पक्का होता है कि ब्राउज़र सेवा में कोई बाउंड क्लाइंट नहीं है और
को
ओएस पर टैप करें.
अगर आपको बाद में, 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
}
};