ภาพรวม MediaRouteProvider

เฟรมเวิร์กของเราเตอร์สื่อ Android ช่วยให้ผู้ผลิตเปิดใช้การเล่นในอุปกรณ์ของตนได้ ผ่านอินเทอร์เฟซมาตรฐานที่เรียกว่า MediaRouteProvider ผู้ให้บริการเส้นทางกำหนดอินเทอร์เฟซทั่วไปสำหรับเล่นสื่อในอุปกรณ์รับ สามารถเล่นสื่อบนอุปกรณ์จากแอปพลิเคชัน Android ใดก็ได้ที่สนับสนุนสื่อ เส้นทาง

คู่มือนี้จะอธิบายวิธีสร้างผู้ให้บริการเส้นทางสื่อสำหรับอุปกรณ์ผู้รับและวิธี ใช้ได้กับแอปพลิเคชันเล่นสื่ออื่นๆ ที่ทำงานใน Android ในการใช้ API นี้ คุณต้อง ควรทำความคุ้นเคยกับคลาสคีย์ MediaRouteProvider MediaRouteProviderDescriptor และ RouteController

ภาพรวม

เฟรมเวิร์กเราเตอร์สื่อของ Android ช่วยให้นักพัฒนาแอปสื่อและอุปกรณ์เล่นสื่อได้ ผู้ผลิตในการเชื่อมต่อผ่าน API และอินเทอร์เฟซผู้ใช้ทั่วไป นักพัฒนาแอปที่ ติดตั้งใช้งานอินเทอร์เฟซ MediaRouter จึงจะเชื่อมต่อกับ จัดเฟรมเวิร์กและเล่นเนื้อหาไปยังอุปกรณ์ที่เข้าร่วมเฟรมเวิร์กของเราเตอร์สื่อ สื่อ ผู้ผลิตอุปกรณ์การเล่นสามารถเข้าร่วมในกรอบงานโดยการเผยแพร่ MediaRouteProvider ที่อนุญาตให้แอปพลิเคชันอื่นๆ เชื่อมต่อและ เล่นสื่อในอุปกรณ์รับ รูปที่ 1 แสดงให้เห็นว่าแอปเชื่อมต่อกับผู้รับ อุปกรณ์ผ่านเฟรมเวิร์กของเราเตอร์สื่อ

รูปที่ 1 ภาพรวมว่าชั้นเรียนของผู้ให้บริการเส้นทางสื่อให้การสื่อสารอย่างไร จากแอปสื่อไปยังอุปกรณ์รับ

เมื่อคุณสร้างผู้ให้บริการเส้นทางสื่อสำหรับอุปกรณ์ผู้รับ ผู้ให้บริการดังกล่าวจะให้บริการ วัตถุประสงค์ต่อไปนี้

  • อธิบายและเผยแพร่ความสามารถของอุปกรณ์ที่เป็นผู้รับเพื่อให้แอปอื่นๆ ค้นพบได้ และใช้ฟีเจอร์การเล่น
  • รวมอินเทอร์เฟซการเขียนโปรแกรมของอุปกรณ์รับและการสื่อสารของอุปกรณ์ กลไกการส่งข้อมูลเพื่อให้อุปกรณ์เข้ากันได้กับเฟรมเวิร์กของเราเตอร์สื่อ

การกระจายของผู้ให้บริการเส้นทาง

ผู้ให้บริการเส้นทางสื่อได้รับการเผยแพร่โดยเป็นส่วนหนึ่งของแอป Android ผู้ให้บริการเส้นทางของคุณอาจจะเป็น ให้แอปอื่นๆ ใช้งานได้ด้วยการขยาย MediaRouteProviderServiceหรือสรุปการติดตั้งใช้งาน MediaRouteProviderด้วยบริการของคุณเองและประกาศความตั้งใจ สำหรับผู้ให้บริการเส้นทางสื่อ ขั้นตอนเหล่านี้ช่วยให้แอปอื่นๆ สามารถค้นพบและใช้ประโยชน์จาก เส้นทางสื่อของคุณ

หมายเหตุ: แอปที่มีผู้ให้บริการเส้นทางสื่อยังสามารถรวม อินเทอร์เฟซ MediaRouter ไปยัง แต่ไม่จำเป็นต้องระบุ

ไลบรารีการสนับสนุน MediaRouter

มีการกําหนด API ของเราเตอร์สื่อไว้ในส่วน ไลบรารี AndroidX MediaRouter คุณต้องเพิ่มไลบรารีนี้ลงในโปรเจ็กต์การพัฒนาแอปของคุณ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มไลบรารีการสนับสนุนไปยัง โปรดดูโปรเจ็กต์ที่หัวข้อการตั้งค่าไลบรารีการสนับสนุน

ข้อควรระวัง: อย่าลืมใช้ AndroidX การใช้งานเฟรมเวิร์กของเราเตอร์สื่อ อย่าใช้แพ็กเกจ android.media เวอร์ชันเก่า

การสร้างบริการของผู้ให้บริการ

เฟรมเวิร์กของเราเตอร์สื่อต้องค้นพบและเชื่อมต่อกับผู้ให้บริการเส้นทางสื่อของคุณได้ อนุญาตให้แอปพลิเคชันอื่นใช้เส้นทางของคุณได้ โดยเฟรมเวิร์กของเราเตอร์สื่อ จะค้นหาแอปที่ประกาศการดำเนินการ Intent ของผู้ให้บริการเส้นทางสื่อ เมื่อแอปอื่นต้องการ เชื่อมต่อกับผู้ให้บริการ เฟรมเวิร์กจะต้องสามารถเรียกใช้ และเชื่อมต่อกับผู้ให้บริการได้ ดังนั้นผู้ให้บริการ ต้องอยู่ใน Service

โค้ดตัวอย่างต่อไปนี้แสดงการประกาศบริการของผู้ให้บริการเส้นทางสื่อและ ตัวกรอง Intent ในไฟล์ Manifest ซึ่งช่วยให้เราเตอร์สื่อค้นพบและใช้งานได้ เฟรมเวิร์ก:

<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>

ตัวอย่างไฟล์ Manifest นี้จะประกาศบริการที่รวมคลาสของผู้ให้บริการเส้นทางสื่อจริง เฟรมเวิร์กของเราเตอร์สื่อ Android มอบ คลาส MediaRouteProviderService สำหรับใช้เป็น Wrapper บริการสำหรับ ของผู้ให้บริการเส้นทางสื่อ โค้ดตัวอย่างต่อไปนี้แสดงวิธีใช้ Wrapper นี้ ชั้นเรียน:

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);
    }
}

การระบุความสามารถของเส้นทาง

แอปที่เชื่อมต่อกับเฟรมเวิร์กของเราเตอร์สื่อสามารถค้นพบเส้นทางสื่อผ่าน ที่มีการประกาศไฟล์ Manifest ของแอป แต่ก็จําเป็นต้องทราบความสามารถของเส้นทางสื่อของคุณด้วย ที่มีให้ เส้นทางสื่ออาจเป็นได้หลายประเภท มีฟีเจอร์แตกต่างกัน และจะมีแอปอื่นๆ ด้วย ต้องค้นพบรายละเอียดเหล่านี้เพื่อดูว่าเข้ากันได้กับเส้นทางของคุณหรือไม่

เฟรมเวิร์กของเราเตอร์สื่อช่วยให้คุณกำหนดและเผยแพร่ความสามารถของสื่อได้ กำหนดเส้นทางผ่านวัตถุ IntentFilter รายการ วัตถุ MediaRouteDescriptor รายการ และ MediaRouteProviderDescriptor ส่วนนี้จะอธิบายวิธีใช้ เพื่อเผยแพร่รายละเอียดเส้นทางสื่อสำหรับแอปอื่นๆ

หมวดหมู่เส้นทาง

ในคำอธิบายแบบเป็นโปรแกรมของผู้ให้บริการเส้นทางสื่อ คุณต้องระบุ ผู้ให้บริการรองรับการเล่นระยะไกล เอาต์พุตสำรอง หรือทั้ง 2 อย่าง นี่คือเส้นทาง หมวดหมู่ที่กำหนดโดยเฟรมเวิร์กของเราเตอร์สื่อมีดังนี้

  • 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);
    }
}

หากระบุ Intent CATEGORY_REMOTE_PLAYBACK คุณต้องกำหนดประเภทสื่อและ ผู้ให้บริการเส้นทางสื่อของคุณรองรับตัวควบคุมการเล่น ส่วนถัดไปจะอธิบายถึงวิธีการ ระบุการตั้งค่าเหล่านี้สำหรับอุปกรณ์ของคุณ

ประเภทสื่อและโปรโตคอล

ผู้ให้บริการเส้นทางสื่อสำหรับอุปกรณ์การเล่นระยะไกลต้องระบุประเภทสื่อและการโอน โปรโตคอลที่ระบบรองรับ คุณสามารถระบุการตั้งค่าเหล่านี้โดยใช้ IntentFilter ชั้นเรียนและaddDataScheme()และ addDataType() เมธอดของออบเจ็กต์นั้น ข้อมูลโค้ดต่อไปนี้แสดงวิธีกำหนดตัวกรอง Intent เพื่อรองรับวิดีโอระยะไกล เล่นโดยใช้ http, https และโปรโตคอลการสตรีมแบบเรียลไทม์ (RTSP) ดังนี้

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);
        }
    }
}

ส่วนควบคุมการเล่น

ผู้ให้บริการเส้นทางสื่อที่มีการเล่นระยะไกลต้องระบุประเภทของตัวควบคุมสื่อ ที่รองรับ การควบคุมประเภททั่วไปที่เส้นทางสื่อมีได้มีดังนี้

  • ตัวควบคุมการเล่น เช่น เล่น หยุดชั่วคราว กรอกลับ และกรอไปข้างหน้า
  • ฟีเจอร์การจัดคิว ช่วยให้แอปที่ส่งเพิ่มและนำรายการออกได้ จากเพลย์ลิสต์ที่ดูแลจัดการโดยอุปกรณ์ที่เป็นผู้รับ
  • ฟีเจอร์เซสชัน ซึ่งป้องกันไม่ให้ส่งแอปแทรกแซง โดยให้อุปกรณ์ที่เป็นผู้รับระบุรหัสเซสชัน ให้กับแอปที่ส่งคำขอ แล้วตรวจสอบ กับคำขอควบคุมการเล่นในครั้งต่อๆ ไป

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีสร้างตัวกรอง Intent เพื่อสนับสนุน การควบคุมการเล่นเส้นทางสื่อพื้นฐาน:

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);
    }
    ...
}

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Intent ตัวควบคุมการเล่นที่ใช้ได้ โปรดดู MediaControlIntent ชั้นเรียน

MediaRouteProviderDescriptor

หลังจากกำหนดความสามารถของเส้นทางสื่อโดยใช้ออบเจ็กต์ IntentFilter คุณจะสร้างออบเจ็กต์ข้อบ่งชี้สำหรับการเผยแพร่ไปยังได้ เฟรมเวิร์กเราเตอร์สื่อของ Android ออบเจ็กต์ข้อบ่งชี้นี้มีข้อมูลที่เฉพาะเจาะจงของสื่อของคุณ ของความสามารถของเส้นทางเพื่อให้แอปพลิเคชันอื่นสามารถกำหนดวิธีโต้ตอบกับสื่อของคุณได้ เส้นทาง

โค้ดตัวอย่างต่อไปนี้แสดงวิธีเพิ่มตัวกรอง Intent ที่สร้างขึ้นก่อนหน้านี้ลงใน 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 มีเจตนาที่จะทำหน้าที่เป็น Wrapper สำหรับ API ไปยังอุปกรณ์เล่นสื่อของคุณ การนำวิธีการมาใช้ในชั้นเรียนนี้คือ ทั้งหมดขึ้นอยู่กับอินเทอร์เฟซแบบเป็นโปรแกรมที่ได้จากอุปกรณ์ที่เป็นผู้รับ

โค้ดตัวอย่าง

MediaRouter ตัวอย่างแสดงวิธีสร้างผู้ให้บริการเส้นทางสื่อที่กำหนดเอง