MediaRouteProvider की खास जानकारी

Android मीडिया राऊटर फ़्रेमवर्क की मदद से, मैन्युफ़ैक्चरर अपने डिवाइसों पर वीडियो चलाने की सुविधा चालू कर सकते हैं MediaRouteProvider नाम के स्टैंडर्ड इंटरफ़ेस के ज़रिए साइन इन किया जा सकता है. रूट देने वाली कंपनी, रिसीवर डिवाइस पर मीडिया चलाने के लिए एक सामान्य इंटरफ़ेस के बारे में बताती है मीडिया चलाने की सुविधा देने वाले किसी भी Android ऐप्लिकेशन से, आपके उपकरण पर मीडिया चलाया जा सकता है इस्तेमाल कर सकते हैं.

इस गाइड में, रिसीवर डिवाइस के लिए मीडिया रूट प्रोवाइडर बनाने और उसे बनाने का तरीका बताया गया है जो Android पर चलने वाले दूसरे मीडिया प्लेबैक ऐप्लिकेशन के लिए उपलब्ध होते हैं. इस एपीआई का इस्तेमाल करने के लिए, कुंजी क्लास के बारे में पता होना चाहिए MediaRouteProvider MediaRouteProviderDescriptor, और RouteController.

खास जानकारी

Android मीडिया राऊटर फ़्रेमवर्क, मीडिया ऐप्लिकेशन डेवलपर और मीडिया प्लेबैक डिवाइस की सुविधा देता है निर्माता को एक सामान्य API और सामान्य यूज़र इंटरफ़ेस के ज़रिए कनेक्ट करने में मदद करता है. वह ऐप्लिकेशन डेवलपर जो MediaRouter इंटरफ़ेस लागू करने के बाद, मीडिया राऊटर फ़्रेमवर्क के साथ काम करने वाले डिवाइसों पर कॉन्टेंट चलाए जाने की सुविधा देता है. मीडिया वीडियो चलाने की सुविधा देने वाले डिवाइस बनाने वाली कंपनियां, MediaRouteProvider पब्लिश करके फ़्रेमवर्क में हिस्सा ले सकती हैं. इससे अन्य ऐप्लिकेशन, रिसीवर डिवाइस पर मीडिया चलाने के लिए. इमेज 1 में दिखाया गया है कि कोई ऐप्लिकेशन किसी रिसीविंग से कैसे कनेक्ट होता है से कनेक्ट किया जा सकता है.

पहला डायग्राम. मीडिया रूट की सेवा देने वाली कंपनियों की क्लास से बातचीत करने के तरीके की खास जानकारी मीडिया ऐप्लिकेशन से कॉन्टेंट पाने वाले डिवाइस पर.

जब रिसीवर डिवाइस के लिए मीडिया रूट की सेवा देने वाली कंपनी बनाई जाती है, तब वह कंपनी ये मकसद:

  • रिसीवर डिवाइस की क्षमताओं के बारे में बताएँ और उसे पब्लिश करें, ताकि दूसरे ऐप्लिकेशन उसे खोज सकें और इसकी प्लेबैक सुविधाओं का इस्तेमाल करें.
  • रिसीवर डिवाइस के प्रोग्रामिंग इंटरफ़ेस और उसके कम्यूनिकेशन को रैप करें डिवाइस को मीडिया राऊटर फ़्रेमवर्क के साथ काम करने लायक बनाने के लिए ट्रांसपोर्ट मैकेनिज़्म.

रूट देने वाली कंपनियों का वितरण

मीडिया रूट की सेवा देने वाली कंपनी, Android ऐप्लिकेशन के हिस्से के तौर पर उपलब्ध कराई गई है. रास्ते की सेवा देने वाली कंपनी तक बढ़ा कर अन्य ऐप्लिकेशन के लिए उपलब्ध कराया जाता है MediaRouteProviderService या लागू करने की प्रोसेस के आखिर में MediaRouteProvider को आपकी सेवा के साथ सबमिट करें और इंटेंट का एलान करें फ़िल्टर का इस्तेमाल करें. इसकी मदद से अन्य ऐप्लिकेशन, Google Play पर आपका मीडिया रूट.

ध्यान दें: जिस ऐप्लिकेशन में मीडिया रूट की सेवा देने वाली कंपनी शामिल है उसमें यह जानकारी भी शामिल हो सकती है: MediaRouter इंटरफ़ेस को रूट प्रोवाइडर के तौर पर काम कर रहा है, लेकिन इसकी ज़रूरत नहीं है.

MediaRouter की सहायता लाइब्रेरी

मीडिया राऊटर एपीआई इसमें तय किए गए हैं AndroidX MediaRouter लाइब्रेरी आपको इस लाइब्रेरी को अपने ऐप्लिकेशन डेवलपमेंट प्रोजेक्ट में जोड़ना होगा. अपने प्रोजेक्ट में, सहायता लाइब्रेरी का सेटअप देखें.

चेतावनी: AndroidX का इस्तेमाल ज़रूर करें मीडिया राऊटर फ़्रेमवर्क को लागू करना. पुराने android.media पैकेज का इस्तेमाल न करें.

सेवा देने वाली कंपनी बनाना

मीडिया राऊटर फ़्रेमवर्क, मीडिया रूट देने वाली कंपनी को खोजने और उससे कनेक्ट करने में सक्षम होना चाहिए अन्य ऐप्लिकेशन को आपके रूट का इस्तेमाल करने की अनुमति देने के लिए. ऐसा करने के लिए, मीडिया राऊटर फ़्रेमवर्क ऐसे ऐप्लिकेशन खोजता है जो मीडिया रूट प्रोवाइडर के इंटेंट ऐक्शन का एलान करते हैं. जब कोई दूसरा ऐप्लिकेशन चाहता है कि से कनेक्ट करते हैं, तो फ़्रेमवर्क ऐसा होना चाहिए कि वह शुरू हो और उससे कनेक्ट हो, ताकि आपका प्रोवाइडर को Service में एनकैप्सुलेट करना चाहिए.

नीचे दिए गए उदाहरण में, मीडिया रूट की सेवा देने वाली कंपनी और मेनिफ़ेस्ट में इंटेंट फ़िल्टर लगाया जाता है. इससे मीडिया राऊटर उसे खोज पाता है और इस्तेमाल कर पाता है फ़्रेमवर्क:

<service android:name=".provider.SampleMediaRouteProviderService"
    android:label="@string/sample_media_route_provider_service"
    android:process=":mrp">
    <intent-filter>
        <action android:name="android.media.MediaRouteProviderService" />
    </intent-filter>
</service>

मेनिफ़ेस्ट के इस उदाहरण में ऐसी सेवा के बारे में बताया गया है जो मीडिया रूट देने वाली असल कंपनी की क्लास को शामिल करती है. Android मीडिया राऊटर फ़्रेमवर्क, सर्विस रैपर के तौर पर इस्तेमाल करने के लिए MediaRouteProviderService क्लास मीडिया रूट देने वाली कंपनियां. उदाहरण के तौर पर दिया गया यह कोड, इस रैपर को इस्तेमाल करने का तरीका बताता है क्लास:

Kotlin

class SampleMediaRouteProviderService : MediaRouteProviderService() {

    override fun onCreateMediaRouteProvider(): MediaRouteProvider {
        return SampleMediaRouteProvider(this)
    }
}

Java

public class SampleMediaRouteProviderService extends MediaRouteProviderService {

    @Override
    public MediaRouteProvider onCreateMediaRouteProvider() {
        return new SampleMediaRouteProvider(this);
    }
}

रूट की क्षमताएं तय करना

मीडिया राऊटर फ़्रेमवर्क से कनेक्ट करने वाले ऐप्लिकेशन, मेनिफ़ेस्ट फ़ाइल में दी गई जानकारी शामिल है. हालांकि, इसके लिए यह भी ज़रूरी है कि आप उन मीडिया रूट की क्षमताओं के बारे में जानें उपलब्ध करा रहे हैं. मीडिया रूट अलग-अलग तरह के हो सकते हैं. साथ ही, उनमें अलग-अलग सुविधाएं और अन्य ऐप्लिकेशन हो सकते हैं आपको इस जानकारी के बारे में पता होना चाहिए, ताकि यह पता चल सके कि ये आपके रास्ते के साथ काम करते हैं या नहीं.

मीडिया राऊटर फ़्रेमवर्क आपको अपने मीडिया की क्षमताओं को तय और पब्लिश करने में मदद करता है IntentFilter ऑब्जेक्ट, MediaRouteDescriptor ऑब्जेक्ट, और MediaRouteProviderDescriptor से होकर गुज़रता है. इस सेक्शन में बताया गया है कि अन्य ऐप्लिकेशन के लिए आपके मीडिया रूट की जानकारी पब्लिश करने के लिए क्लास.

रास्ते की कैटगरी

प्रोग्राम के हिसाब से, अपने मीडिया रूट की सेवा देने वाली कंपनी की जानकारी के हिस्से के तौर पर, आपको यह जानकारी देनी होगी कि चाहे आपका प्रोवाइडर रिमोट प्लेबैक, सेकंडरी आउटपुट या दोनों की सुविधा देता हो. ये रहे रास्ते मीडिया राऊटर फ़्रेमवर्क की ओर से दी गई कैटगरी:

  • CATEGORY_LIVE_AUDIO अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है — किसी दूसरे आउटपुट डिवाइस, जैसे कि वायरलेस कनेक्शन वाले संगीत सिस्टम पर ऑडियो का आउटपुट देना.
  • CATEGORY_LIVE_VIDEO अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है — वायरलेस डिसप्ले डिवाइस जैसे किसी दूसरे आउटपुट डिवाइस पर वीडियो का आउटपुट देना.
  • CATEGORY_REMOTE_PLAYBACK — मीडिया मैनेज करने वाले किसी अलग डिवाइस पर वीडियो या ऑडियो चलाएं वापस लाना, डिकोड करना, और प्लेबैक, जैसे कि Chromecast डिवाइस.

अपने मीडिया रूट के ब्यौरे में इन सेटिंग को शामिल करने के लिए, आप इन्हें एक IntentFilter ऑब्जेक्ट, जिसे बाद में MediaRouteDescriptor ऑब्जेक्ट:

Kotlin

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    companion object {
        private val CONTROL_FILTERS_BASIC: ArrayList<IntentFilter> = IntentFilter().run {
            addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
            arrayListOf(this)
        }
    }
}

Java

public final class SampleMediaRouteProvider extends MediaRouteProvider {
    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
    static {
        IntentFilter videoPlayback = new IntentFilter();
        videoPlayback.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
        CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>();
        CONTROL_FILTERS_BASIC.add(videoPlayback);
    }
}

अगर आपको CATEGORY_REMOTE_PLAYBACK इंटेंट तय करना है, तो आपको यह भी बताना होगा कि किस तरह का मीडिया और प्लेबैक कंट्रोल, मीडिया रूट देने वाली कंपनी के साथ काम करते हैं. अगले सेक्शन में, अपने डिवाइस के लिए ये सेटिंग तय करें.

मीडिया के टाइप और प्रोटोकॉल

रिमोट प्लेबैक डिवाइस के लिए मीडिया रूट देने वाली कंपनी को मीडिया के प्रकार और ट्रांसफ़र की जानकारी देनी होगी ये प्रोटोकॉल काम करते हैं. इन सेटिंग को तय करने के लिए, IntentFilter का इस्तेमाल किया जाता है क्लास और addDataScheme() और उस ऑब्जेक्ट की addDataType() तरीके हैं. कॉन्टेंट बनाने इस कोड स्निपेट का इस्तेमाल करके, रिमोट वीडियो के साथ काम करने वाले इंटेंट फ़िल्टर को तय करने का तरीका बताया गया है एचटीटीपी, एचटीटीपीएस, और रीयल टाइम स्ट्रीमिंग प्रोटोकॉल (आरटीएसपी) का इस्तेमाल करके वीडियो चलाने के लिए:

Kotlin

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    companion object {

        private fun IntentFilter.addDataTypeUnchecked(type: String) {
            try {
                addDataType(type)
            } catch (ex: IntentFilter.MalformedMimeTypeException) {
                throw RuntimeException(ex)
            }
        }

        private val CONTROL_FILTERS_BASIC: ArrayList<IntentFilter> = IntentFilter().run {
            addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
            addAction(MediaControlIntent.ACTION_PLAY)
            addDataScheme("http")
            addDataScheme("https")
            addDataScheme("rtsp")
            addDataTypeUnchecked("video/*")
            arrayListOf(this)
        }
    }
    ...
}

Java

public final class SampleMediaRouteProvider extends MediaRouteProvider {

    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;

    static {
        IntentFilter videoPlayback = new IntentFilter();
        videoPlayback.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
        videoPlayback.addAction(MediaControlIntent.ACTION_PLAY);
        videoPlayback.addDataScheme("http");
        videoPlayback.addDataScheme("https");
        videoPlayback.addDataScheme("rtsp");
        addDataTypeUnchecked(videoPlayback, "video/*");
        CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>();
        CONTROL_FILTERS_BASIC.add(videoPlayback);
    }
    ...

    private static void addDataTypeUnchecked(IntentFilter filter, String type) {
        try {
            filter.addDataType(type);
        } catch (MalformedMimeTypeException ex) {
            throw new RuntimeException(ex);
        }
    }
}

प्लेबैक कंट्रोल

रिमोट प्लेबैक की सुविधा देने वाले मीडिया रूट की सेवा देने वाली कंपनी को, मीडिया कंट्रोल के टाइप तय करने होंगे यह काम करता है. मीडिया रूट से मिलने वाले सामान्य प्रकार के नियंत्रण यहां दिए गए हैं:

  • प्लेबैक कंट्रोल, जैसे कि चलाएं, रोकें, रिवाइंड करें, और फ़ास्ट-फ़ॉरवर्ड करें.
  • सूची बनाने की सुविधाएं, जिनकी मदद से ईमेल भेजने वाले ऐप्लिकेशन को आइटम जोड़ने और हटाने की सुविधा मिलती है किसी ऐसी प्लेलिस्ट को लिंक करता है जिसका रखरखाव पाने वाले डिवाइस पर होता है.
  • सेशन की सुविधाएं, जो ऐप्लिकेशन को किसी भी सेशन में रुकावट डालने से रोकती हैं दूसरा विकल्प यह है कि पाने वाले डिवाइस से अनुरोध करने वाले ऐप्लिकेशन को एक सेशन आईडी दें और फिर जांच करें हर एक प्लेबैक कंट्रोल अनुरोध के साथ उस आईडी का इस्तेमाल करें.

नीचे दिए गए कोड उदाहरण में, काम के लिए इंटेंट फ़िल्टर बनाने का तरीका बताया गया है मीडिया रूट के लिए बुनियादी प्लेबैक कंट्रोल:

Kotlin

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    companion object {
        ...
        private val CONTROL_FILTERS_BASIC: ArrayList<IntentFilter> = run {
            val videoPlayback: IntentFilter = ...
            ...
            val playControls = IntentFilter().apply {
                addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
                addAction(MediaControlIntent.ACTION_SEEK)
                addAction(MediaControlIntent.ACTION_GET_STATUS)
                addAction(MediaControlIntent.ACTION_PAUSE)
                addAction(MediaControlIntent.ACTION_RESUME)
                addAction(MediaControlIntent.ACTION_STOP)
            }
            arrayListOf(videoPlayback, playControls)
        }
    }
    ...
}

Java

public final class SampleMediaRouteProvider extends MediaRouteProvider {
    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
    static {
        ...
        IntentFilter playControls = new IntentFilter();
        playControls.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
        playControls.addAction(MediaControlIntent.ACTION_SEEK);
        playControls.addAction(MediaControlIntent.ACTION_GET_STATUS);
        playControls.addAction(MediaControlIntent.ACTION_PAUSE);
        playControls.addAction(MediaControlIntent.ACTION_RESUME);
        playControls.addAction(MediaControlIntent.ACTION_STOP);
        CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>();
        CONTROL_FILTERS_BASIC.add(videoPlayback);
        CONTROL_FILTERS_BASIC.add(playControls);
    }
    ...
}

उपलब्ध प्लेबैक कंट्रोल इंटेंट के बारे में ज़्यादा जानने के लिए, देखें MediaControlIntent क्लास.

MediaRouteProviderDescriptor

IntentFilter ऑब्जेक्ट का इस्तेमाल करके, मीडिया रूट की सुविधाएं तय करने के बाद, पब्लिश करने के लिए डिस्क्रिप्टर ऑब्जेक्ट बनाएं Android मीडिया राऊटर फ़्रेमवर्क पर आधारित होगा. इस डिस्क्रिप्टर ऑब्जेक्ट में आपके मीडिया की खास जानकारी शामिल है ताकि अन्य ऐप्लिकेशन यह तय कर सकें कि आपके मीडिया से कैसे इंटरैक्ट किया जाए रूट

नीचे दिए गए उदाहरण कोड में, पहले बनाए गए इंटेंट फ़िल्टर को MediaRouteProviderDescriptor और डिस्क्रिप्टर को इसके लिए सेट करें मीडिया राऊटर फ़्रेमवर्क:

Kotlin

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    init {
        publishRoutes()
    }

    private fun publishRoutes() {
        val resources = context.resources
        val routeName: String = resources.getString(R.string.variable_volume_basic_route_name)
        val routeDescription: String = resources.getString(R.string.sample_route_description)
        // Create a route descriptor using previously created IntentFilters
        val routeDescriptor: MediaRouteDescriptor =
                MediaRouteDescriptor.Builder(VARIABLE_VOLUME_BASIC_ROUTE_ID, routeName)
                        .setDescription(routeDescription)
                        .addControlFilters(CONTROL_FILTERS_BASIC)
                        .setPlaybackStream(AudioManager.STREAM_MUSIC)
                        .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
                        .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
                        .setVolumeMax(VOLUME_MAX)
                        .setVolume(mVolume)
                        .build()
        // Add the route descriptor to the provider descriptor
        val providerDescriptor: MediaRouteProviderDescriptor =
                MediaRouteProviderDescriptor.Builder()
                        .addRoute(routeDescriptor)
                        .build()

        // Publish the descriptor to the framework
        descriptor = providerDescriptor
    }
    ...
}

Java

public SampleMediaRouteProvider(Context context) {
    super(context);
    publishRoutes();
}

private void publishRoutes() {
    Resources r = getContext().getResources();
    // Create a route descriptor using previously created IntentFilters
    MediaRouteDescriptor routeDescriptor = new MediaRouteDescriptor.Builder(
            VARIABLE_VOLUME_BASIC_ROUTE_ID,
            r.getString(R.string.variable_volume_basic_route_name))
            .setDescription(r.getString(R.string.sample_route_description))
            .addControlFilters(CONTROL_FILTERS_BASIC)
            .setPlaybackStream(AudioManager.STREAM_MUSIC)
            .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
            .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
            .setVolumeMax(VOLUME_MAX)
            .setVolume(mVolume)
            .build();
    // Add the route descriptor to the provider descriptor
    MediaRouteProviderDescriptor providerDescriptor =
            new MediaRouteProviderDescriptor.Builder()
            .addRoute(routeDescriptor)
            .build();

    // Publish the descriptor to the framework
    setDescriptor(providerDescriptor);
}

उपलब्ध डिस्क्रिप्टर सेटिंग के बारे में ज़्यादा जानकारी के लिए, रेफ़रंस दस्तावेज़ देखें MediaRouteDescriptor और MediaRouteProviderDescriptor के लिए.

रास्तों को कंट्रोल करना

जब कोई ऐप्लिकेशन आपके मीडिया रूट की सेवा देने वाली कंपनी से कनेक्ट होता है, तो सेवा देने वाली कंपनी को वीडियो चलाने की सुविधा मिलती है ये निर्देश, मीडिया राऊटर फ़्रेमवर्क के ज़रिए अन्य ऐप्लिकेशन से आपके रूट पर भेजे जाते हैं. मैनेज करने के लिए अनुरोध है, तो आपको एक MediaRouteProvider.RouteController क्लास लागू करने की सुविधा देनी होगी, जो कमांड को प्रोसेस करता हो और आपके रिसीवर डिवाइस पर वास्तविक कम्यूनिकेशन को हैंडल करता है.

मीडिया राऊटर फ़्रेमवर्क, onCreateRouteController() को कॉल करता है इस क्लास का इंस्टेंस पाने के लिए, रूट देने वाली कंपनी का तरीका सेट करता है. इसके बाद, इसके अनुरोधों को रूट करता है. ये MediaRouteProvider.RouteController क्लास के मुख्य तरीके हैं. इन्हें लागू करने पर ही, ये तरीके अपनाए जा सकते हैं आपका मीडिया रूट कंपनी:

  • onSelect() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है — यह तब कॉल किया जाता है, जब कोई ऐप्लिकेशन प्लेबैक के लिए आपका रूट चुनता है. आप ये काम करने के लिए इस तरीके का इस्तेमाल करते हैं मीडिया प्लेबैक शुरू होने से पहले किसी भी तरह की तैयारी की ज़रूरत पड़ सकती है.
  • onControlRequest() — फ़ाइल पाने वाले डिवाइस पर, वीडियो चलाने के खास निर्देश भेजता है.
  • onSetVolume() — यह प्लेबैक वॉल्यूम को सेट करने के लिए, अनुरोध करने वाले डिवाइस को अनुरोध भेजता है तय करें.
  • onUpdateVolume() — यह मैसेज पाने वाले डिवाइस को, वीडियो चलाने की सेटिंग में बदलाव करने का अनुरोध भेजता है किसी तय सीमा से वॉल्यूम को हाइलाइट करें.
  • onUnselect() — यह तब कॉल किया जाता है, जब कोई ऐप्लिकेशन किसी रूट से चुने हुए का निशान हटाता है.
  • onRelease() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है — यह तब कॉल किया जाता है, जब फ़्रेमवर्क के लिए रास्ते की ज़रूरत न हो. इससे, रास्ते की अपनी संसाधन.

आवाज़ में बदलाव को छोड़कर, प्लेबैक कंट्रोल करने के सभी अनुरोध onControlRequest() पर भेज दिए जाते हैं तरीका. अगर आपने इस तरीके को लागू किया है, तो कंट्रोल के अनुरोधों को पार्स करना और उनका जवाब देना ज़रूरी है सही तरीके से काम करना चाहिए. यहां इस विधि को लागू करने का एक उदाहरण दिया गया है, जो रिमोट प्लेबैक मीडिया रूट:

Kotlin

private class SampleRouteController : MediaRouteProvider.RouteController() {
    ...

    override fun onControlRequest(
            intent: Intent,
            callback: MediaRouter.ControlRequestCallback?
    ): Boolean {
        return if (intent.hasCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
            val action = intent.action
            when (action) {
                MediaControlIntent.ACTION_PLAY -> handlePlay(intent, callback)
                MediaControlIntent.ACTION_ENQUEUE -> handleEnqueue(intent, callback)
                MediaControlIntent.ACTION_REMOVE -> handleRemove(intent, callback)
                MediaControlIntent.ACTION_SEEK -> handleSeek(intent, callback)
                MediaControlIntent.ACTION_GET_STATUS -> handleGetStatus(intent, callback)
                MediaControlIntent.ACTION_PAUSE -> handlePause(intent, callback)
                MediaControlIntent.ACTION_RESUME -> handleResume(intent, callback)
                MediaControlIntent.ACTION_STOP -> handleStop(intent, callback)
                MediaControlIntent.ACTION_START_SESSION -> handleStartSession(intent, callback)
                MediaControlIntent.ACTION_GET_SESSION_STATUS ->
                    handleGetSessionStatus(intent, callback)
                MediaControlIntent.ACTION_END_SESSION -> handleEndSession(intent, callback)
                else -> false
            }.also {
                Log.d(TAG, sessionManager.toString())
            }
        } else {
            false
        }
    }
    ...
}

Java

private final class SampleRouteController extends
        MediaRouteProvider.RouteController {
    ...

    @Override
    public boolean onControlRequest(Intent intent, ControlRequestCallback callback) {

        String action = intent.getAction();

        if (intent.hasCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
            boolean success = false;
            if (action.equals(MediaControlIntent.ACTION_PLAY)) {
                success = handlePlay(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_ENQUEUE)) {
                success = handleEnqueue(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_REMOVE)) {
                success = handleRemove(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_SEEK)) {
                success = handleSeek(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_GET_STATUS)) {
                success = handleGetStatus(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_PAUSE)) {
                success = handlePause(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_RESUME)) {
                success = handleResume(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_STOP)) {
                success = handleStop(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_START_SESSION)) {
                success = handleStartSession(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_GET_SESSION_STATUS)) {
                success = handleGetSessionStatus(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_END_SESSION)) {
                success = handleEndSession(intent, callback);
            }

            Log.d(TAG, sessionManager.toString());
            return success;
        }
        return false;
    }
    ...
}

यह समझना ज़रूरी है कि MediaRouteProvider.RouteController क्लास का मकसद रैपर के तौर पर काम करना है एपीआई के लिए डाउनलोड करें. इस क्लास में तरीकों को लागू किया जाना है यह प्रोग्राम के हिसाब से जो इंटरफ़ेस आपको मिलता है उस पर निर्भर करता है.

नमूना कोड

MediaRouter सैंपल में, कस्टम मीडिया रूट की सेवा देने वाली कंपनी बनाने का तरीका बताया गया है.