การใช้งานวิทยุบังคับ

การใช้งานการควบคุมวิทยุจะอิงตาม MediaSession และ MediaBrowse ซึ่งช่วยให้แอปสื่อและแอปผู้ช่วยเสียงควบคุมวิทยุได้ ดูข้อมูลเพิ่มเติมได้ที่สร้างแอปสื่อสำหรับรถยนต์ใน developer.android.com

การใช้งานโครงสร้างการเรียกดูสื่อมีอยู่ในไลบรารี car-broadcastradio-support ใน packages/apps/Car/libs คลังนี้ยังมีส่วนขยายของ ProgramSelector เพื่อแปลงเป็น URI และจาก URI ด้วย ขอแนะนําให้การใช้งานวิทยุใช้คลังนี้เพื่อสร้างทรีการเรียกดูที่เกี่ยวข้อง

ตัวสลับแหล่งที่มาของสื่อ

ไลบรารี car-media-common มีคลาสที่ควรผสานรวมไว้ในแอปวิทยุเพื่อให้วิทยุและแอปอื่นๆ ที่แสดงในสื่อทำงานร่วมกันได้อย่างราบรื่น MediaAppSelectorWidgetสามารถรวมไว้ใน XML สําหรับแอปวิทยุ (ไอคอนและเมนูแบบเลื่อนลงที่ใช้ในสื่ออ้างอิงและแอปวิทยุ)

<com.android.car.media.common.MediaAppSelectorWidget
    android:id="@+id/app_switch_container"
    android:layout_width="@dimen/app_switch_widget_width"
    android:layout_height="wrap_content"
    android:background="@drawable/app_item_background"
    android:gravity="center" />

วิดเจ็ตนี้จะเปิด AppSelectionFragment ซึ่งจะแสดงรายการแหล่งที่มาของสื่อที่เปลี่ยนไปใช้ได้ หากต้องการ UI อื่นนอกเหนือจากที่ระบุไว้ คุณสามารถสร้างวิดเจ็ตที่กำหนดเองเพื่อเปิด AppSelectionFragment เมื่อควรแสดงตัวสลับ

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

ตัวอย่างการใช้งานมีอยู่ในการใช้งานแอปวิทยุอ้างอิง ซึ่งอยู่ใน packages/apps/Car/Radio

ข้อกำหนดการควบคุมโดยละเอียด

อินเทอร์เฟซ MediaSession (ผ่าน MediaSession.Callback) มีกลไกการควบคุมสำหรับรายการวิทยุที่เล่นอยู่ในปัจจุบัน ดังนี้

  • onPlay, onStop เปิด/ปิดเสียงการเล่นวิทยุ
  • onPause. หยุดชั่วคราวแบบเลื่อนเวลา (หากรองรับ)
  • onPlayFromMediaId. เล่นเนื้อหาจากโฟลเดอร์ระดับบนสุด เช่น "เปิด FM" หรือ "เปิดวิทยุ"
  • onPlayFromUri. เล่นความถี่ที่เฉพาะเจาะจง เช่น "เปิด FM 88.5"
  • onSkipToNext, onSkipToPrevious ปรับสถานีถัดไปหรือก่อนหน้า
  • onSetRating เพิ่มหรือนำออกจากรายการโปรด

MediaBrowser จะแสดง MediaItem ที่ปรับแต่งได้ผ่านไดเรกทอรีระดับบนสุด 3 ประเภท ดังนี้

  • (ไม่บังคับ) รายการ (สถานี) โดยทั่วไปแล้ว โหมดนี้ใช้โดยวิทยุแบบ 2 เครื่องรับสัญญาณเพื่อระบุสถานีวิทยุทั้งหมดที่ปรับได้ ณ ตำแหน่งของผู้ใช้
  • รายการโปรด รายการวิทยุที่เพิ่มลงในรายการโปรดบางรายการอาจไม่พร้อมใช้งาน (อยู่นอกระยะสัญญาณ)
  • ช่องย่านความถี่ ช่องที่เป็นไปได้ทั้งหมดในภูมิภาคปัจจุบัน (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1 และอื่นๆ) แต่ละวงจะมีไดเรกทอรีระดับบนสุดแยกกัน
โครงสร้างต้นไม้ของ MediaBrowserService
รูปที่ 2 โครงสร้างต้นไม้ของ MediaBrowserService

องค์ประกอบแต่ละรายการในโฟลเดอร์เหล่านี้ (AM/FM/Programs) คือ MediaItem ที่มี URI ซึ่งสามารถใช้กับ MediaSession เพื่อปรับแต่งได้ โฟลเดอร์ระดับบนสุดแต่ละโฟลเดอร์ (AM/FM/Programs) คือ MediaItem ที่มี mediaId ซึ่งสามารถใช้กับ MediaSession เพื่อทริกเกอร์การเล่นและขึ้นอยู่กับการพิจารณาของ OEM ตัวอย่างเช่น "เปิด FM" "เปิด AM" และ "เปิดวิทยุ" ล้วนเป็นการค้นหาวิทยุที่ไม่เจาะจงซึ่งใช้ mediaId เพื่อส่งไปยังแอปวิทยุ OEM ขึ้นอยู่กับแอปวิทยุที่จะเลือกสิ่งที่จะเล่นจากคำขอทั่วไปและ mediaId

MediaSession

เนื่องจากไม่มีแนวคิดในการหยุดสตรีมการออกอากาศชั่วคราว การดำเนินการเล่น หยุดชั่วคราว และหยุดจึงใช้กับวิทยุไม่ได้เสมอไป สำหรับวิทยุ การดำเนินการ "หยุด" จะเชื่อมโยงกับการปิดเสียงสตรีม ส่วน "เล่น" จะเชื่อมโยงกับการเลิกปิดเสียง

เครื่องรับวิทยุ (หรือแอป) บางรุ่นสามารถจำลองการหยุดสตรีมการออกอากาศชั่วคราวได้โดยแคชเนื้อหาไว้แล้วเล่นอีกครั้งในภายหลัง ในกรณีดังกล่าว ให้ใช้ onPause

การเล่นจากการดำเนินการ mediaId และ URI มีไว้เพื่อปรับสถานีที่ดึงมาจากอินเทอร์เฟซ MediaBrowser mediaId คือสตริงที่กำหนดเองซึ่งแอปวิทยุระบุเพื่อกำหนดค่าที่ไม่ซ้ำกัน (เพื่อให้รหัสหนึ่งๆ ชี้ไปยังรายการเดียวเท่านั้น) และค่าที่คงที่ (เพื่อให้รายการหนึ่งๆ มีรหัสเดียวกันตลอดทั้งเซสชัน) เพื่อระบุสถานีหนึ่งๆ URI จะเป็นสคีมาที่กําหนดไว้อย่างดี กล่าวโดยย่อคือ รูปแบบ ProgramSelector ที่เป็น URI แม้ว่าวิธีนี้จะรักษาแอตทริบิวต์ความเป็นเอกลักษณ์ไว้ แต่ก็ไม่จําเป็นต้องคงที่ แม้ว่าจะเปลี่ยนแปลงได้เมื่อสถานีย้ายไปความถี่อื่น

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

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

การข้ามไปยังสถานีถัดไปหรือก่อนหน้าจะขึ้นอยู่กับบริบทปัจจุบัน ดังนี้

  • เมื่อปรับแอปให้รับสถานีจากรายการโปรด แอปจะเปลี่ยนไปรับสถานีถัดไปจากรายการโปรดได้
  • การฟังสถานีจากรายการโปรแกรมอาจส่งผลให้ระบบปรับเป็นสถานีถัดไปที่พร้อมใช้งาน โดยจัดเรียงตามหมายเลขช่อง
  • การฟังช่องใดก็ได้อาจส่งผลให้ระบบปรับช่องเป็นช่องถัดไป แม้ว่าจะไม่มีสัญญาณออกอากาศก็ตาม

แอปวิทยุจะจัดการการดำเนินการเหล่านี้

การจัดการข้อผิดพลาด

TransportControls การดำเนินการ (เล่น หยุด และถัดไป) จะไม่แสดงผลป้อนกลับว่าการดำเนินการสำเร็จหรือไม่ วิธีเดียวที่จะระบุข้อผิดพลาดได้คือการตั้งค่าสถานะของ MediaSession ให้มีค่าเป็น STATE_ERROR พร้อมข้อความแสดงข้อผิดพลาด

แอปวิทยุต้องจัดการการดำเนินการเหล่านั้นและดำเนินการหรือตั้งค่าสถานะข้อผิดพลาด หากการเรียกใช้คําสั่ง Play ไม่ได้เกิดขึ้นทันที สถานะการเล่นควรเปลี่ยนเป็น STATE_CONNECTING (ในกรณีที่ปรับแต่งโดยตรง) หรือ STATE_SKIPPING_TO_PREVIOUS หรือ NEXT ขณะที่มีการเรียกใช้คําสั่ง

ลูกค้าควรดู PlaybackState และยืนยันว่าเซสชันเปลี่ยนโปรแกรมปัจจุบันเป็นโปรแกรมที่ขอหรือเข้าสู่สถานะข้อผิดพลาด STATE_CONNECTING ต้องไม่เกิน 30 วินาที อย่างไรก็ตาม การปรับความถี่ AM/FM โดยตรงควรมีประสิทธิภาพเร็วกว่ามาก

เพิ่มและนำรายการโปรดออก

MediaSession รองรับการจัดประเภท ซึ่งสามารถใช้เพื่อควบคุมรายการโปรดได้ onSetRating เรียกใช้ด้วยการจัดประเภทของประเภท RATING_HEART เพิ่มหรือนำสถานีที่กําลังรับฟังอยู่ในขณะนี้ออกจากรายการโปรด

โมเดลนี้ใช้รายการรายการโปรดที่ไม่มีการจัดเรียงและไม่จำกัด ซึ่งต่างจากค่ากําหนดล่วงหน้าเดิม เมื่อมีการกําหนดช่องตัวเลข (โดยทั่วไปคือ 1 ถึง 6) ให้กับรายการโปรดที่บันทึกไว้แต่ละรายการ ด้วยเหตุนี้ ระบบที่ใช้ค่าที่กำหนดล่วงหน้าจึงใช้ร่วมกับonSetRating การดำเนินการไม่ได้

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

เบราว์เซอร์สื่อ

หากต้องการแสดงว่าย่านความถี่หรือชื่อช่องจริง (เมื่อปรับแต่งเป็นช่องใดก็ได้ที่เหมาะกับเทคโนโลยีวิทยุหนึ่งๆ) ใดใช้ได้กับภูมิภาคหนึ่งๆ ระบบจะแสดงช่อง (ความถี่) ทั้งหมดที่ใช้ได้สำหรับแต่ละย่านความถี่ ในพื้นที่สหรัฐอเมริกา ช่อง FM จะมีทั้งหมด 101 ช่องในช่วงความถี่ 87.8 ถึง 108.0 MHz (ใช้ระยะห่าง 0.2 MHz) และช่อง AM จะมีทั้งหมด 117 ช่องในช่วงความถี่ 530 ถึง 1700 kHz (ใช้ระยะห่าง 10 kHz) เนื่องจากวิทยุ HD ใช้พื้นที่ช่องเดียวกัน ระบบจึงไม่แสดงแยกกัน

รายการวิทยุที่พร้อมใช้งานในปัจจุบันเป็นแบบแบน ซึ่งไม่อนุญาตให้ใช้รูปแบบการแสดงผล เช่น การจัดกลุ่มตามกลุ่มการออกอากาศเสียงโดยตรง (DAB)

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

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

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". ค่าใดค่าหนึ่งต่อไปนี้
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1 โปรแกรมที่มีให้บริการในปัจจุบัน
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 รายการโปรด
    • BCRADIO_FOLDER_TYPE_BAND = 3 ช่องทางกายภาพทั้งหมดสำหรับย่านความถี่หนึ่งๆ

    คุณไม่จำเป็นต้องกำหนดช่องข้อมูลเมตาที่กำหนดเองสำหรับวิทยุ เนื่องจากข้อมูลที่เกี่ยวข้องทั้งหมดจะพอดีกับรูปแบบ MediaBrowser.MediaItem ที่มีอยู่

    • ชื่อรายการ (RDS PS, ชื่อบริการ DAB) MediaDescription.getTitle
    • ความถี่ FM URI (ดูProgramSelector) หรือ MediaDescription.getTitle (หากรายการอยู่ในโฟลเดอร์ BROADCASTRADIO_FOLDER_TYPE_BAND)
    • ตัวระบุเฉพาะวิทยุ (RDS PI, DAB SID) MediaDescription.getMediaUri แยกวิเคราะห์เป็น ProgramSelector

    โดยปกติแล้ว ไม่จำเป็นต้องดึงข้อมูลความถี่ FM สำหรับรายการในรายการที่กำลังเล่นหรือรายการโปรด (เนื่องจากไคลเอ็นต์ควรทำงานกับรหัสสื่อ) อย่างไรก็ตาม หากจำเป็นต้องใช้ (เช่น เพื่อวัตถุประสงค์ในการแสดงผล) ข้อมูลดังกล่าวจะอยู่ใน URI และสามารถแยกวิเคราะห์เป็น ProgramSelector ได้ อย่างไรก็ตาม ไม่แนะนําให้ใช้ URI เพื่อเลือกรายการภายในเซสชันปัจจุบัน ดูรายละเอียดได้ที่ ProgramSelector

    บริการ MediaBrowser ต้องรองรับการแบ่งหน้าเพื่อหลีกเลี่ยงปัญหาด้านประสิทธิภาพหรือ Binder

    หมายเหตุ: ระบบจะใช้การแบ่งหน้าโดยค่าเริ่มต้นในตัวแปร onLoadChildren() ที่ไม่มีการจัดการตัวเลือก

    รายการที่เกี่ยวข้องจากรายการทุกประเภท (ช่องดิบ รายการที่พบ และรายการโปรด) อาจใช้ mediaId ที่แตกต่างกัน (ขึ้นอยู่กับแอปวิทยุ ไลบรารีการสนับสนุนจะมีค่าแตกต่างกัน) URI (ในรูปแบบ ProgramSelector) จะแตกต่างกันระหว่างช่องดิบกับรายการที่พบในเกือบทุกกรณี (ยกเว้น FM ที่ไม่มี RDS) แต่ส่วนใหญ่จะเหมือนกันระหว่างรายการที่พบกับรายการโปรด (ยกเว้นในกรณีที่ AF ได้รับการอัปเดต)

    การมี mediaId ที่แตกต่างกันสำหรับรายการจากรายการประเภทต่างๆ จะช่วยให้ดำเนินการต่างๆ กับรายการเหล่านั้นได้ คุณสามารถไปยังรายการรายการโปรดหรือรายการโปรแกรมทั้งหมดใน onSkipToNext โดยขึ้นอยู่กับโฟลเดอร์ของ MediaItem ที่เลือกล่าสุด (ดูMediaSession)

    การดำเนินการปรับแต่งพิเศษ

    รายการโปรแกรมช่วยให้ผู้ใช้สามารถปรับสถานีที่ต้องการได้ แต่ไม่อนุญาตให้ผู้ใช้ส่งคำขอทั่วไป เช่น "ปรับเป็น FM" ซึ่งอาจส่งผลให้ระบบปรับเป็นสถานีที่ฟังล่าสุดในย่านความถี่ FM

    ไดเรกทอรีระดับบนสุดบางรายการมีการตั้งค่า Flag FLAG_PLAYABLE (พร้อมกับ FLAG_BROWSABLE สำหรับโฟลเดอร์) เพื่อรองรับการดำเนินการดังกล่าว

    การทำงาน ปรับจูนไปที่ วิธีออกใบแจ้งหนี้
    ฟังวิทยุ ช่องวิทยุใดก็ได้ startService(ACTION_PLAY_BROADCASTRADIO)

    หรือ

    playFromMediaId(MediaBrowser.getRoot())
    เปิดวิทยุ FM ช่อง FM ใดก็ได้ เล่นจาก mediaId ของย่านความถี่ FM

    การกำหนดว่าจะเลือกรายการใดนั้นขึ้นอยู่กับแอป ซึ่งโดยปกติแล้วจะเป็นช่องที่เลือกดูล่าสุดจากรายการที่ระบุ โปรดดูรายละเอียดเกี่ยวกับ ACTION_PLAY_BROADCASTRADIO ที่หัวข้อIntent การเล่นทั่วไป

    การค้นพบและการเชื่อมต่อบริการ

    PackageManager สามารถค้นหา MediaBrowserService ที่แสดงรายการวิทยุกระจายเสียงได้โดยตรง ต้นไม้ โดยเรียกใช้ resolveService ด้วย Intent ACTION_PLAY_BROADCASTRADIO (ดูIntent การเล่นทั่วไป) และ Flag MATCH_SYSTEM_ONLY หากต้องการค้นหาบริการทั้งหมดที่ให้บริการวิทยุ (อาจมีมากกว่า 1 รายการ เช่น AM/FM และดาวเทียมแยกกัน) ให้ใช้ queryIntentServices

    บริการที่แก้ไขแล้วจะจัดการกับ Intent android.media.browse.MediaBrowserService bind ด้วย ข้อมูลนี้ได้รับการยืนยันจาก GTS

    หากต้องการเชื่อมต่อกับ MediaBrowserService ที่เลือก ให้สร้างอินสแตนซ์ MediaBrowser สำหรับคอมโพเนนต์บริการและ connect หนึ่งๆ หลังจากสร้างการเชื่อมต่อแล้ว คุณจะได้รับแฮนเดิลของ MediaSession ผ่าน getSessionToken

    แอปวิทยุสามารถจํากัดแพ็กเกจไคลเอ็นต์ที่อนุญาตให้เชื่อมต่อในการใช้งานบริการของแอปได้ onGetRoot แอปควรอนุญาตให้แอปของระบบเชื่อมต่อได้โดยไม่ต้องเพิ่มในรายการที่อนุญาตพิเศษ โปรดดูรายละเอียดเกี่ยวกับรายการที่อนุญาตพิเศษที่หัวข้อยอมรับแพ็กเกจและลายเซ็นแอป Assistant

    หากติดตั้งแอปเฉพาะแหล่งที่มา (เช่น แอปวิทยุ) ในอุปกรณ์ที่ไม่รองรับแหล่งที่มาดังกล่าว แอปจะยังคงโฆษณาตัวเองว่าจัดการ Intent ACTION_PLAY_BROADCASTRADIO แต่ทรี MediaBrowser จะไม่มีแท็กเฉพาะวิทยุ ดังนั้น ลูกค้าที่ต้องการตรวจสอบว่าแหล่งที่มาหนึ่งๆ พร้อมใช้งานบนอุปกรณ์หรือไม่ จะต้องดำเนินการดังนี้

    1. ค้นพบบริการวิทยุ (โทร resolveService สำหรับ ACTION_PLAY_BROADCASTRADIO)
    2. สร้าง MediaBrowser แล้วเชื่อมต่อกับ MediaBrowser
    3. ระบุการมีอยู่ของ MediaItem ด้วย EXTRA_BCRADIO_FOLDER_TYPE เพิ่มเติม

    หมายเหตุ: ในกรณีส่วนใหญ่ ไคลเอ็นต์ต้องสแกนต้นไม้ MediaBrowser ทั้งหมดที่มีอยู่เพื่อตรวจหาแหล่งที่มาทั้งหมดที่มีสำหรับอุปกรณ์หนึ่งๆ

    ชื่อย่านความถี่

    รายการแบนด์แสดงด้วยชุดไดเรกทอรีระดับบนสุดที่มีการตั้งค่าแท็กประเภทโฟลเดอร์เป็น BCRADIO_FOLDER_TYPE_BAND ชื่อ MediaItem ของศิลปินเป็นสตริงที่แปลแล้วซึ่งแสดงถึงชื่อวง ในกรณีส่วนใหญ่ ข้อความจะเหมือนกับคำแปลภาษาอังกฤษ แต่ลูกค้าต้องไม่คาดหวังเช่นนั้น

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

    • AM
    • FM
    • DAB

    หากวงดนตรีไม่อยู่ในรายการนี้ ก็ไม่ควรตั้งค่าแท็กชื่อวง อย่างไรก็ตาม หากวงดนตรีอยู่ในรายการ วงดนตรีนั้นจะต้องมีการตั้งค่าแท็ก วิทยุ HD ไม่ได้แสดงรายการย่านความถี่แยกต่างหาก เนื่องจากใช้สื่อพื้นฐานเดียวกับ AM/FM

    Intent การเล่นทั่วไป

    แอปแต่ละแอปที่เล่นแหล่งที่มาหนึ่งๆ โดยเฉพาะ (เช่น วิทยุหรือซีดี) ต้องจัดการความตั้งใจทั่วไปในการเล่นเพื่อเริ่มเล่นเนื้อหาบางอย่างที่อาจมาจากสถานะไม่ทำงาน (เช่น หลังจากการบูต) การเลือกเนื้อหาที่จะเล่นนั้นขึ้นอยู่กับแอป แต่โดยปกติแล้วจะเป็นรายการวิทยุหรือแทร็ก CD ที่เล่นล่าสุด แต่ละแหล่งที่มาของเสียงจะมี Intent แยกกันดังนี้

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA หรือ CD-Text
    • android.car.intent.action.PLAY_DATADISC: แผ่นข้อมูลแบบออปติคอล เช่น CD/DVD แต่ไม่ใช่ CD-DA (อาจเป็น CD แบบผสม)
    • android.car.intent.action.PLAY_AUX: โดยไม่ระบุพอร์ต AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: ไม่ได้ระบุอุปกรณ์ USB
    • android.car.intent.action.PLAY_LOCAL: พื้นที่เก็บข้อมูลสื่อในเครื่อง (แฟลชในตัว)

    เราเลือก Intent เพื่อใช้กับคําสั่งเล่นทั่วไป เนื่องจากสามารถแก้ปัญหา 2 อย่างพร้อมกันได้ ได้แก่ คําสั่งเล่นทั่วไปเองและการค้นหาบริการ ประโยชน์เพิ่มเติมของการมี Intent ดังกล่าวคือความสามารถในการดำเนินการง่ายๆ ดังกล่าวโดยไม่ต้องเปิดเซสชัน MediaBrowser

    การค้นพบบริการเป็นปัญหาที่สำคัญกว่าที่อินเทนต์เหล่านี้ช่วยแก้ปัญหาได้ ขั้นตอนในการค้นหาบริการจะง่ายและชัดเจนด้วยวิธีนี้ (ดูการค้นพบและการเชื่อมต่อบริการ)

    หากต้องการให้การติดตั้งใช้งานไคลเอ็นต์บางรายการง่ายขึ้น ก็มีวิธีอื่นในการออกคําสั่ง Play ดังกล่าว (ซึ่งแอปวิทยุต้องใช้ด้วย) นั่นคือ ออก playFromMediaId ที่มี rootId ของโหนดรูท (ใช้เป็น mediaId) แม้ว่า root node ไม่ได้มีไว้สำหรับการเล่น แต่ rootId จะเป็นสตริงที่กำหนดเองซึ่งสามารถทำให้ใช้งานได้เป็น mediaId อย่างไรก็ตาม ลูกค้าไม่จำเป็นต้องเข้าใจความแตกต่างนี้

    ProgramSelector

    แม้ว่า mediaId จะเพียงพอที่จะเลือกช่องจาก MediaBrowserService แต่ค่านี้จะผูกอยู่กับเซสชันและจะไม่สอดคล้องกันระหว่างผู้ให้บริการ ในบางกรณี ไคลเอ็นต์อาจต้องใช้เคอร์เซอร์แบบสัมบูรณ์ (เช่น ความถี่สัมบูรณ์) เพื่อรักษาระหว่างเซสชันและอุปกรณ์

    ในยุคการออกอากาศวิทยุดิจิทัล คลื่นความถี่เพียงอย่างเดียวไม่เพียงพอที่จะปรับไปยังสถานีที่ต้องการ ดังนั้น ให้ใช้ ProgramSelector เพื่อปรับช่องเป็นแอนะล็อกหรือดิจิทัล ProgramSelector ประกอบด้วย 2 ส่วน ได้แก่

    • ตัวระบุหลัก ตัวระบุที่ไม่ซ้ำกันและเสถียรสำหรับสถานีวิทยุหนึ่งๆ ซึ่งจะไม่เปลี่ยนแปลง แต่อาจไม่เพียงพอที่จะปรับสถานีนั้น เช่น รหัส PI ของ RDS ซึ่งอาจแปลเป็นสัญญาณเรียกขานในสหรัฐอเมริกา
    • ตัวระบุรอง ตัวระบุเพิ่มเติมที่มีประโยชน์สำหรับการปรับสถานีนั้น (เช่น ความถี่) ซึ่งอาจรวมถึงตัวระบุจากเทคโนโลยีวิทยุอื่นๆ เช่น สถานี DAB อาจมีการออกอากาศแบบอนาล็อกสำรอง

    หากต้องการให้ ProgramSelector ทำงานร่วมกับโซลูชันที่ใช้ MediaBrowser หรือ MediaSession ให้กําหนดสคีมา URI เพื่อจัดรูปแบบ สคีมาได้รับการกําหนดดังนี้

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>

    ในตัวอย่างนี้ ส่วนตัวระบุรอง (หลังเครื่องหมายคําถาม (?)) จะเป็นหรือไม่ก็ได้ และสามารถนําออกได้เพื่อให้ได้ตัวระบุที่เสถียรสําหรับใช้เป็น mediaId เช่น

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    ส่วนที่เป็นหน่วยงาน (หรือที่เรียกว่าโฮสต์) ของ program มีพื้นที่บางส่วนสำหรับการขยายรูปแบบในอนาคต สตริงประเภทตัวระบุจะระบุอย่างละเอียดตามชื่อในคำจำกัดความ IdentifierType ของ HAL 2.x และรูปแบบค่าคือตัวเลขฐานสิบหรือฐานสิบหก (มีคำนำหน้า 0x)

    ตัวระบุเฉพาะผู้ให้บริการทั้งหมดจะแสดงด้วยคำนำหน้า VENDOR_ เช่น VENDOR_0 สำหรับ VENDOR_START และ VENDOR_1 สำหรับ VENDOR_START บวก 1 URI ดังกล่าวมีไว้สำหรับฮาร์ดแวร์วิทยุที่ใช้สร้าง URI เท่านั้น และโอนระหว่างอุปกรณ์ที่ผลิตโดย OEM รายต่างๆ ไม่ได้

    คุณต้องกำหนด URI เหล่านี้ให้กับ MediaItem แต่ละรายการในโฟลเดอร์วิทยุระดับบนสุด นอกจากนี้ MediaSession ต้องรองรับทั้ง playFromMediaId และ playFromUri อย่างไรก็ตาม URI มีไว้สำหรับการดึงข้อมูลเมตาของวิทยุ (เช่น ความถี่ FM) และพื้นที่เก็บข้อมูลถาวรเป็นหลัก เราไม่รับประกันว่า URI จะพร้อมใช้งานสำหรับรายการสื่อทั้งหมด (เช่น เมื่อเฟรมเวิร์กยังไม่รองรับประเภทรหัสหลัก) ในทางกลับกัน รหัสสื่อจะใช้งานได้เสมอ ไม่แนะนําให้ไคลเอ็นต์ใช้ URI เพื่อเลือกรายการจากเซสชัน MediaBrowser ปัจจุบัน แต่ให้ใช้ playFromMediaId แทน อย่างไรก็ตาม แอปที่แสดงจะต้องระบุ URI นี้ และเราจะสงวน URI ที่ขาดหายไปไว้สำหรับกรณีที่สมเหตุสมผล

    การออกแบบครั้งแรกใช้โคลอนเดี่ยวแทนลำดับ :// หลังส่วนรูปแบบ อย่างไรก็ตาม android.net.Uri ไม่รองรับรูปแบบแรกสำหรับข้อมูลอ้างอิง URI แบบลําดับชั้นที่สมบูรณ์

    ประเภทแหล่งที่มาอื่นๆ

    แหล่งที่มาของเสียงอื่นๆ จัดการได้แบบเดียวกัน เช่น อินพุตเสริมและเครื่องเล่นซีดีออดิโอ

    แอปเดียวอาจแสดงแหล่งที่มาหลายประเภท ในกรณีเช่นนี้ เราขอแนะนําให้คุณสร้าง MediaBrowserService แยกกันสําหรับแหล่งข้อมูลแต่ละประเภท แม้ในการตั้งค่าที่มีแหล่งที่มา/MediaBrowserServices ที่แสดงหลายรายการ เราขอแนะนำอย่างยิ่งให้มี MediaSession รายการเดียวภายในแอปเดียว

    ซีดีเพลง

    คล้ายกับซีดีเพลงตรงที่แอปที่แสดงดิสก์ดังกล่าวจะแสดง MediaBrowser ที่มีรายการที่เรียกดูได้รายการเดียว (หรือมากกว่านั้นหากระบบมีที่เปลี่ยนซีดี) ซึ่งจะมีแทร็กทั้งหมดของซีดีนั้น หากระบบไม่ทราบเกี่ยวกับแทร็กในซีดีทุกแผ่น (เช่น เมื่อใส่แผ่นทั้งหมดลงในคาร์ทริดจ์พร้อมกันและระบบไม่อ่านแผ่นทั้งหมด) MediaItem สำหรับทั้งแผ่นจะเป็นเพียง PLAYABLE ไม่ใช่ BROWSABLE + PLAYABLE หากไม่มีดิสก์ในช่องหนึ่งๆ รายการนั้นจะไม่ได้เป็น PLAYABLE หรือ BROWSABLE (แต่แต่ละช่องต้องอยู่ในต้นไม้เสมอ)

     โครงสร้างแผนผังซีดีเสียง
    รูปที่ 3 โครงสร้างแผนผังซีดีเสียง

    ระบบจะทำเครื่องหมายรายการเหล่านี้ในลักษณะเดียวกับโฟลเดอร์วิทยุกระจายเสียง โดยจะมีช่องเพิ่มเติมที่ระบุไว้ใน MediaDescription API ดังนี้

    • EXTRA_CD_TRACK: สำหรับ MediaItem แต่ละรายการใน Audio CD หมายเลขแทร็กแบบฐาน 1
    • EXTRA_CD_DISK: หมายเลขดิสก์ฐาน 1

    สำหรับระบบที่เปิดใช้ CD-Text และดิสก์ที่เข้ากันได้ MediaItem ระดับบนสุดจะมีชื่อของดิสก์ ในทำนองเดียวกัน MediaItems สำหรับแทร็กจะมีชื่อของแทร็ก

    อินพุตเสริม

    แอปที่แสดงอินพุตเสริมจะแสดงทรี MediaBrowser ที่มีรายการเดียว (หรือมากกว่านั้นหากมีพอร์ตหลายพอร์ต) ซึ่งแสดงพอร์ต AUX in MediaSession ที่เกี่ยวข้องจะนำ MediaId ของตนไปใช้และเปลี่ยนไปใช้แหล่งที่มานั้นหลังจากได้รับคําขอ playFromMediaId

    โครงสร้างต้นไม้ AUX
    รูปที่ 4 โครงสร้างต้นไม้ AUX

    รายการ MediaItem ของ AUX แต่ละรายการจะมีช่องเพิ่มเติม EXTRA_AUX_PORT_NAME ซึ่งตั้งค่าเป็นชื่อพอร์ตที่ไม่ได้แปล โดยไม่ต้องมีวลี "AUX" เช่น "AUX 1" จะต้องตั้งค่าเป็น "1", "AUX front" เป็น "front" และ "AUX" เป็นสตริงว่าง ในภาษาที่ไม่ใช่ภาษาอังกฤษ แท็กชื่อจะยังคงเป็นสตริงภาษาอังกฤษเดิม ไม่น่าเป็นไปได้เนื่องจากค่าของ EXTRA_BCRADIO_BAND_NAME_EN กำหนดโดย OEM และไม่ได้จำกัดอยู่ในรายการที่กำหนดไว้ล่วงหน้า

    หากฮาร์ดแวร์ตรวจพบอุปกรณ์ที่เชื่อมต่อกับพอร์ต AUX ฮาร์ดแวร์ควรทำเครื่องหมาย MediaItem เป็น PLAYABLE เฉพาะในกรณีที่มีการเชื่อมต่ออินพุตเท่านั้น ฮาร์ดแวร์ควรยังได้รับการแจกแจง (แต่ไม่ใช่ PLAYABLE) หากไม่มีการเชื่อมต่อกับพอร์ตนี้ หากฮาร์ดแวร์ไม่มีความสามารถดังกล่าว จะต้องตั้งค่า MediaItem เป็น PLAYABLE เสมอ

    ฟิลด์เพิ่มเติม

    กําหนดฟิลด์ต่อไปนี้

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    ลูกค้าต้องตรวจสอบ MediaItems ระดับบนสุดเพื่อดูองค์ประกอบที่มีการตั้งค่าฟิลด์เพิ่มเติม EXTRA_CD_DISK หรือ EXTRA_AUX_PORT_NAME

    ตัวอย่างโดยละเอียด

    ตัวอย่างต่อไปนี้แสดงโครงสร้างต้นไม้ของ MediaBrowser สำหรับประเภทแหล่งที่มาที่เป็นส่วนหนึ่งของการออกแบบนี้

    MediaBrowserService ของวิทยุกระจายเสียง (แฮนเดิล ACTION_PLAY_BROADCASTRADIO):

    • สถานี (เรียกดูได้)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI ของ BBC One (เล่นได้): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI ของ ABC 88.1 (เล่นได้): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI ของ ABC 88.1 HD1 (เล่นได้): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI ของ ABC 88.1 HD2 (เล่นได้): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (เล่นได้) - FM ที่ไม่มี RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI ของ 620 AM (เล่นได้): broadcastradio://program/AMFM_FREQUENCY/620
      • URI ของ BBC One (เล่นได้): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • รายการโปรด (เรียกดูได้ เล่นได้)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI ของ BBC One (เล่นได้): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (เล่นไม่ได้)URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (เรียกดูได้ เล่นได้): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (เล่นได้) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (เล่นได้) URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (เล่นได้) URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (เรียกดูได้ เล่นได้): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 FM (เล่นได้) URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 FM (เล่นได้) URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 FM (เล่นได้) URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (เล่นได้): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    MediaBrowserService ของซีดีเพลง (แฮนเดิล ACTION_PLAY_AUDIOCD):

    • แผ่นที่ 1 (เล่นได้) EXTRA_CD_DISK=1
    • แผ่นที่ 2 (เรียกดูได้ เล่นได้) EXTRA_CD_DISK=2
      • แทร็ก 1 (เล่นได้) EXTRA_CD_TRACK=1
      • แทร็ก 2 (เล่นได้) EXTRA_CD_TRACK=2
    • CD เพลงของฉัน (เรียกดูได้ เล่นได้) EXTRA_CD_DISK=3
      • All By Myself (เล่นได้) EXTRA_CD_TRACK=1
      • Reise, Reise (เล่นได้) EXTRA_CD_TRACK=2
    • ช่อง 4 ว่างเปล่า (เล่นไม่ได้) EXTRA_CD_DISK=4

    MediaBrowserService ของ AUX (แฮนเดิล ACTION_PLAY_AUX):

    • AUX ด้านหน้า (เล่นได้) EXTRA_AUX_PORT_NAME="front"
    • AUX ด้านหลัง (เล่นได้) EXTRA_AUX_PORT_NAME="rear"