การใช้งานการควบคุมวิทยุจะอิงตาม 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 และอื่นๆ) แต่ละวงจะมีไดเรกทอรีระดับบนสุดแยกกัน
องค์ประกอบแต่ละรายการในโฟลเดอร์เหล่านี้ (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
EXTRA_PAGE
EXTRA_PAGE_SIZE
- พารามิเตอร์เพิ่มเติมสําหรับ
subscribe()
หมายเหตุ: ระบบจะใช้การแบ่งหน้าโดยค่าเริ่มต้นในตัวแปร
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
ด้วย IntentACTION_PLAY_BROADCASTRADIO
(ดูIntent การเล่นทั่วไป) และ FlagMATCH_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 จะไม่มีแท็กเฉพาะวิทยุ ดังนั้น ลูกค้าที่ต้องการตรวจสอบว่าแหล่งที่มาหนึ่งๆ พร้อมใช้งานบนอุปกรณ์หรือไม่ จะต้องดำเนินการดังนี้- ค้นพบบริการวิทยุ (โทร
resolveService
สำหรับACTION_PLAY_BROADCASTRADIO
) - สร้าง
MediaBrowser
แล้วเชื่อมต่อกับMediaBrowser
- ระบุการมีอยู่ของ
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-Textandroid.car.intent.action.PLAY_DATADISC
: แผ่นข้อมูลแบบออปติคอล เช่น CD/DVD แต่ไม่ใช่ CD-DA (อาจเป็น CD แบบผสม)android.car.intent.action.PLAY_AUX
: โดยไม่ระบุพอร์ต AUXandroid.car.intent.action.PLAY_BLUETOOTH
android.car.intent.action.PLAY_USB
: ไม่ได้ระบุอุปกรณ์ USBandroid.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
(แต่แต่ละช่องต้องอยู่ในต้นไม้เสมอ)ระบบจะทำเครื่องหมายรายการเหล่านี้ในลักษณะเดียวกับโฟลเดอร์วิทยุกระจายเสียง โดยจะมีช่องเพิ่มเติมที่ระบุไว้ใน MediaDescription API ดังนี้
EXTRA_CD_TRACK
: สำหรับMediaItem
แต่ละรายการใน Audio CD หมายเลขแทร็กแบบฐาน 1EXTRA_CD_DISK
: หมายเลขดิสก์ฐาน 1
สำหรับระบบที่เปิดใช้ CD-Text และดิสก์ที่เข้ากันได้ MediaItem ระดับบนสุดจะมีชื่อของดิสก์ ในทำนองเดียวกัน MediaItems สำหรับแทร็กจะมีชื่อของแทร็ก
อินพุตเสริม
แอปที่แสดงอินพุตเสริมจะแสดงทรี MediaBrowser ที่มีรายการเดียว (หรือมากกว่านั้นหากมีพอร์ตหลายพอร์ต) ซึ่งแสดงพอร์ต AUX in MediaSession ที่เกี่ยวข้องจะนำ MediaId ของตนไปใช้และเปลี่ยนไปใช้แหล่งที่มานั้นหลังจากได้รับคําขอ
playFromMediaId
รายการ 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
- URI ของ BBC One (เล่นได้):
- รายการโปรด (เรียกดูได้ เล่นได้)
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
- URI ของ BBC One (เล่นได้):
- 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
- 530 AM (เล่นได้) URI:
- 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
- 87.7 FM (เล่นได้) URI:
- 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
- แทร็ก 1 (เล่นได้)
- CD เพลงของฉัน (เรียกดูได้ เล่นได้)
EXTRA_CD_DISK=3
- All By Myself (เล่นได้)
EXTRA_CD_TRACK=1
- Reise, Reise (เล่นได้)
EXTRA_CD_TRACK=2
- All By Myself (เล่นได้)
- ช่อง 4 ว่างเปล่า (เล่นไม่ได้)
EXTRA_CD_DISK=4
MediaBrowserService ของ AUX (แฮนเดิล
ACTION_PLAY_AUX
):- AUX ด้านหน้า (เล่นได้)
EXTRA_AUX_PORT_NAME="front"
- AUX ด้านหลัง (เล่นได้)
EXTRA_AUX_PORT_NAME="rear"