การใช้งานวิทยุบังคับอิงตามMediaSession
และ
MediaBrowse
ซึ่งทำให้แอปสื่อและเสียงผู้ช่วยทำสิ่งต่อไปนี้ได้
ควบคุมวิทยุ สำหรับข้อมูลเพิ่มเติม โปรดดู
สร้างแอปสื่อสำหรับรถยนต์ใน developer.android.com
การใช้งาน Media Browse Tree จะให้บริการในการสนับสนุน Car-broadcastRadio
ไลบรารีใน packages/apps/Car/libs
ไลบรารีนี้ยังมีส่วนขยายของ
ProgramSelector เพื่อแปลงไปเป็นและจาก URI ขอแนะนำให้ติดตั้งวิทยุ
ใช้ไลบรารีนี้เพื่อสร้างแผนผังการเรียกดูที่เกี่ยวข้อง
ตัวสลับแหล่งที่มาของสื่อ
เพื่อให้เล่นวิทยุกับแอปอื่นๆ ที่แสดงในสื่อได้อย่างราบรื่น
ไลบรารีสื่อสำหรับรถยนต์ทั่วไปมีคลาสที่ควรใส่ไว้ในวิทยุ
แอป 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
เล่นตามความถี่ที่เจาะจง เช่น "เปิด 88.5 FM"onSkipToNext
,onSkipToPrevious
เปิดเพลงถัดไปหรือก่อนหน้า สถานีonSetRating
เพิ่มหรือนำเข้าหรือออกจากรายการโปรด
MediaBrowser จะแสดงการปรับแต่ง MediaItem ในไดเรกทอรีระดับบนสุด 3 ประเภทดังนี้
- (ไม่บังคับ) โปรแกรม (สถานี) โดยทั่วไปโหมดนี้จะใช้โดย วิทยุแบบจูนเนอร์แบบคู่เพื่อแสดงสถานีวิทยุที่ปรับได้ทั้งหมดที่มี ณ ตำแหน่งของผู้ใช้
- รายการโปรด รายการวิทยุที่เพิ่มลงในรายการโปรด บางรายการอาจเป็น ไม่พร้อมใช้งาน (อยู่นอกระยะสัญญาณ)
- กลุ่มช่อง ช่องที่เป็นไปได้ทั้งหมดในภูมิภาคปัจจุบัน (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1 และอื่นๆ) โดยทุกวงจะมีไดเรกทอรีระดับบนสุดแยกต่างหาก
![โครงสร้างแผนผัง MediaBrowserService](https://source.android.com/static/docs/automotive/images/radio_01.png?authuser=4&hl=th)
องค์ประกอบแต่ละรายการในแต่ละโฟลเดอร์เหล่านี้ (AM/FM/Programs) คือ MediaItem ที่มี URI ที่ใช้งานได้ พร้อม MediaSession เพื่อปรับแต่ง โฟลเดอร์ระดับบนสุดแต่ละโฟลเดอร์ (AM/FM/Programs) คือ MediaItem ที่มี mediaId ที่ สามารถใช้กับ MediaSession เพื่อทริกเกอร์การเล่นและขึ้นอยู่กับการพิจารณาตามที่เห็นสมควรของ OEM สำหรับ เช่น "เปิด FM" "เปิด AM" และ "เปิดวิทยุ" คือคำค้นหาวิทยุทั้งหมดที่ไม่เฉพาะเจาะจงซึ่งใช้ mediaId เพื่อส่งไปยังแอปวิทยุ OEM แอปวิทยุจะกำหนดว่าจะเล่นอะไรจาก คำขอทั่วไปและรหัสสื่อ
เซสชันสื่อ
เนื่องจากไม่มีแนวคิดในการหยุดสตรีมการออกอากาศชั่วคราว การดำเนินการ "เล่น" "หยุดชั่วคราว" และ "หยุด" อาจใช้ไม่ได้กับวิทยุเสมอไป เมื่อใช้วิทยุ การหยุดการทำงานจะเชื่อมโยงกับการปิดเสียงสตรีม ขณะที่ Play นั้นเชื่อมโยงกับ การนำการปิดเสียงออก
ตัวรับสัญญาณวิทยุ (หรือแอป) บางรุ่นมีความสามารถในการจำลองการหยุดสตรีมออกอากาศชั่วคราวได้โดย
แคชเนื้อหาไว้ แล้วค่อยเล่นในภายหลัง ในกรณีเช่นนี้ ให้ใช้ onPause
การเล่นจากการทำงาน MediaId และ URI มีวัตถุประสงค์เพื่อปรับให้เข้ากับสถานี ดึงข้อมูลจากอินเทอร์เฟซ MediaBrowser mediaId เป็นสตริงที่กำหนดเอง ที่มาจากแอปวิทยุเพื่อระบุรหัสที่ไม่ซ้ำกัน (เพื่อให้รหัสที่กำหนดชี้ไปยังรายการเดียวเท่านั้น) และคงที่ (เพื่อให้รายการที่ระบุมีรหัสเดียวกันตลอดทั้งเซสชัน) เพื่อระบุสถานีที่กำหนด URI จะเป็นสคีมาที่กำหนดไว้อย่างชัดเจน กล่าวโดยสรุปคือ จาก ProgramSelector แม้ว่าการทำเช่นนี้จะรักษาแอตทริบิวต์ที่เป็นค่าเดียว แต่ไม่จำเป็นต้อง เสถียร แม้ว่าอาจเปลี่ยนแปลงเมื่อสถานีเปลี่ยนเป็นความถี่อื่นก็ตาม
ระบบออกแบบมาให้ไม่ใช้ 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.2MHz) และช่อง 117 AM ในช่วง 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 ต้องรองรับการใส่เลขหน้า ดังนี้
EXTRA_PAGE
EXTRA_PAGE_SIZE
- พารามิเตอร์เพิ่มเติมสำหรับ
subscribe()
หมายเหตุ: โดยค่าเริ่มต้น ระบบจะใช้การใส่เลขหน้าโดยค่าเริ่มต้นใน
onLoadChildren()
ตัวแปรที่ไม่มีการจัดการตัวเลือกรายการที่เกี่ยวข้องจากรายการทุกประเภท (ช่องดิบ โปรแกรมที่พบและ รายการโปรด) อาจมีรหัสสื่อแตกต่างกัน (ขึ้นอยู่กับแอปวิทยุและการรองรับ ไลบรารีก็จะมีรูปที่ต่างกัน) URI (ในรูปแบบ ProgramSelector) มีความแตกต่างกัน ระหว่างช่องดิบและรายการที่พบในกรณีส่วนใหญ่ (ยกเว้น FM ไม่มี RDS) แต่โดยส่วนใหญ่แล้วจะเหมือนกันระหว่างโปรแกรมที่พบและรายการโปรด (ยกเว้น เช่น เมื่ออัปเดต AF)
การมี mediaId ที่แตกต่างกันสําหรับรายการจากรายการประเภทต่างๆ ทําให้ ก็ดำเนินการได้แตกต่างกัน คุณสามารถข้ามผ่านรายการโปรดหรือ รายการโปรแกรมทั้งหมดบน
onSkipToNext
ทั้งนี้ขึ้นอยู่กับโฟลเดอร์ของMediaItem
ที่เลือก (ดู MediaSession)การดำเนินการปรับแต่งพิเศษ
รายการโปรแกรมช่วยให้ผู้ใช้รับสัญญาณไปยังสถานีที่ต้องการ แต่ไม่อนุญาตให้ผู้ใช้ ส่งคำขอทั่วไป เช่น "ปรับเป็น FM" ซึ่งอาจส่งผลให้มีการปรับ ฟังสถานีด้วยย่านความถี่ FM
ในการสนับสนุนการดำเนินการดังกล่าว ไดเรกทอรีระดับบนสุดบางแห่งจะมี
FLAG_PLAYABLE
ตั้งค่าแฟล็กแล้ว (พร้อมด้วยFLAG_BROWSABLE
สำหรับโฟลเดอร์)การทำงาน เปิดดู วิธีการออก ฟังวิทยุ ช่องวิทยุใดก็ได้ startService(ACTION_PLAY_BROADCASTRADIO)
หรือ
playFromMediaId(MediaBrowser.getRoot())
เปิด FM ช่อง FM ทุกช่อง เล่นจาก mediaId
ของย่านความถี่ FMทั้งนี้ การตัดสินใจว่าจะเปิดโปรแกรมใดนั้นขึ้นอยู่กับแอป นี่คือ ซึ่งโดยทั่วไปแล้วจะเป็นช่องที่ได้รับการปรับแต่งล่าสุด จากรายการที่กำหนด สำหรับรายละเอียดเกี่ยวกับ
ACTION_PLAY_BROADCASTRADIO
โปรดดู Intent Play ทั่วไปการค้นพบและการเชื่อมต่อบริการ
PackageManager
สามารถค้นหา MediaBrowserService ที่แสดงวิทยุกระจายเสียงได้โดยตรง ต้นไม้ หากต้องการดำเนินการ โปรดโทรไปที่resolveService
โดยมีเจตนาACTION_PLAY_BROADCASTRADIO
(โปรดดู จุดประสงค์ Play ทั่วไป) และ แฟล็กMATCH_SYSTEM_ONLY
หากต้องการค้นหาบริการทั้งหมดที่ให้บริการวิทยุ (มี อาจมีมากกว่า 1 อย่าง เช่น แยก AM/FM และดาวเทียม) ให้ใช้queryIntentServices
บริการที่แก้ไขแล้วจะจัดการการเชื่อมโยง
android.media.browse.MediaBrowserService
ความตั้งใจด้วย ยืนยันด้วย GTSหากต้องการเชื่อมต่อกับ MediaBrowserService ที่เลือก สร้าง อินสแตนซ์
MediaBrowser
สำหรับคอมโพเนนต์บริการที่ระบุและconnect
หลังจากทำการเชื่อมต่อแล้ว จะรับแฮนเดิล MediaSession ได้ผ่านgetSessionToken
แอปวิทยุสามารถจำกัดแพ็กเกจของไคลเอ็นต์ที่ได้รับอนุญาตให้เชื่อมต่อใน
onGetRoot
การใช้บริการของตน แอปควรอนุญาตให้แอประบบเชื่อมต่อ โดยไม่ต้องได้รับอนุญาตพิเศษ โปรดดูรายละเอียดเกี่ยวกับการอนุญาตพิเศษที่ ยอมรับแพ็กเกจและลายเซ็นของแอป Assistantหากมีการติดตั้งแอปเฉพาะแหล่งที่มา (เช่น แอปวิทยุ) ใน อุปกรณ์ที่ไม่มีการสนับสนุนแหล่งที่มาดังกล่าว ก็จะยังคงโฆษณาว่าตนเองมีการจัดการ
ACTION_PLAY_BROADCASTRADIO
แต่โครงสร้าง MediaBrowser จะ ไม่มีแท็กเฉพาะวิทยุ ดังนั้น ลูกค้าต้องการตรวจสอบว่า แหล่งที่มาพร้อมใช้งานในอุปกรณ์ ต้องมีลักษณะดังนี้- สำรวจบริการวิทยุ (โทรหา
resolveService
สำหรับACTION_PLAY_BROADCASTRADIO
) - สร้าง
MediaBrowser
แล้วเชื่อมต่อ - หาการมีอยู่ของ
MediaItem
ด้วยEXTRA_BCRADIO_FOLDER_TYPE
เพิ่มเติม
หมายเหตุ: ในกรณีส่วนใหญ่ ไคลเอ็นต์จะต้องสแกนทั้งหมด ต้นไม้ MediaBrowser ที่มีอยู่เพื่อตรวจหาซอร์สที่ใช้ได้ทั้งหมดสำหรับอุปกรณ์นั้นๆ
ชื่อวง
รายการย่านความถี่จะแสดงโดยชุดไดเรกทอรีระดับบนสุดที่มีประเภทโฟลเดอร์ ตั้งค่าแท็กเป็น
BCRADIO_FOLDER_TYPE_BAND
ของMediaItem
title คือสตริงที่แปลแล้วซึ่งแสดงถึงชื่อวง ในกรณีส่วนใหญ่ จะเป็น เหมือนการแปลภาษาอังกฤษ แต่ลูกค้าไม่อาจพึ่งพาสมมติฐานนั้นได้เพื่อให้กลไกที่เสถียรสำหรับการค้นหาย่านความถี่บางย่าน เพิ่มแท็กวงสำหรับโฟลเดอร์สายนาฬิกา
EXTRA_BCRADIO_BAND_NAME_EN
แล้ว นี่คือ ชื่อที่ไม่ใช่คำแปลของวงและสามารถใช้ค่าที่กำหนดไว้ล่วงหน้าค่าใดค่าหนึ่งต่อไปนี้เท่านั้นAM
FM
DAB
หากสายดนตรีไม่อยู่ในรายการนี้ ไม่ควรตั้งค่าแท็กชื่อวง อย่างไรก็ตาม หากแบนด์ภาพอยู่ในรายการ จะต้องมีชุดแท็ก เล่นวิทยุ HD ไม่ได้ แจกแจงย่านความถี่แยกต่างหากเนื่องจากใช้สื่อที่สำคัญเดียวกับ AM/FM
Intent การเล่นทั่วไป
แอปแต่ละแอปที่มีไว้สำหรับการเล่นแหล่งที่มาที่ระบุ (เช่น วิทยุหรือ CD) ต้องจัดการกับ ต้องการ เล่น อย่างทั่วๆ ไปในการเริ่มเล่นเนื้อหาบางส่วนที่อาจมาจาก สถานะไม่ใช้งาน (เช่น หลังจากเปิดเครื่อง) ขึ้นอยู่กับแอปแล้วว่าจะเลือกเนื้อหาอย่างไร แต่มักเป็นรายการวิทยุ หรือ 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 เพื่อใช้กับคำสั่ง Play ทั่วไป เพราะจะแก้โจทย์ จะเกิดปัญหา 2 ข้อขึ้นพร้อมกัน ได้แก่ คำสั่งเล่นทั่วไปและการค้นพบบริการ ประโยชน์เพิ่มเติมของการมีเจตนาดังกล่าวคือสามารถที่จะกระทำการดังกล่าว การดำเนินการง่ายๆ โดยไม่ต้องเปิดเซสชัน MediaBrowser
การค้นพบบริการเป็นปัญหาที่สำคัญกว่า ที่สามารถแก้ไขได้ Intent ขั้นตอนสำหรับการค้นพบบริการทำได้ง่ายและเด่นชัด (ดู การค้นพบและการเชื่อมต่อบริการ)
เพื่อให้การใช้งานของลูกค้าบางกรณีง่ายขึ้น เรามีอีกทางเลือกหนึ่งคือ ออกคำสั่ง Play ดังกล่าว (ซึ่งจะต้องมีการใช้โดยแอปวิทยุด้วย) กำลังออก
playFromMediaId
ด้วย rootId ของโหนดราก (ใช้เป็น mediaId) ในขณะที่ โหนดราก ไม่ได้ออกแบบมาให้เล่นได้ RootId คือสตริงที่กําหนดเอง ซึ่งสามารถทำให้ใช้ได้ชั่วคราวเป็น mediaId อย่างไรก็ตาม คุณไม่จำเป็นต้องมีลูกค้า ในการทำความเข้าใจรายละเอียดเล็กๆ น้อยๆ นี้ตัวเลือกโปรแกรม
แม้ว่า
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
ได้เตรียมการเผื่อไว้ Scheme ในอนาคตได้อีกด้วย มีการระบุสตริงประเภทตัวระบุอย่างชัดเจน เป็นชื่อในคำจำกัดความ HAL 2.x ของIdentifierType
และค่า form คือเลขฐานสิบหรือเลขฐานสิบหก (มี0x
นำหน้า)ตัวระบุเฉพาะผู้ให้บริการทั้งหมดจะแสดงด้วย
VENDOR_
คำนำหน้า เช่นVENDOR_0
สำหรับVENDOR_START
และVENDOR_1
สำหรับVENDOR_START
บวก 1 URI ดังกล่าวมีไว้สำหรับ ฮาร์ดแวร์วิทยุที่สร้างขึ้นและไม่สามารถโอนระหว่างอุปกรณ์ได้ ผลิตโดย OEM ต่างๆต้องกำหนด URI เหล่านี้ให้กับ MediaItem แต่ละรายการใต้ตัวเลือกระดับบนสุด โฟลเดอร์ นอกจากนี้ MediaSession ต้องรองรับทั้ง
playFromMediaId
และplayFromUri
แต่ URI นั้นมีไว้สำหรับวิทยุเป็นหลัก การดึงข้อมูลเมตา (เช่น ความถี่ FM) และพื้นที่เก็บข้อมูลถาวร ไม่มี รับประกันได้ว่า URI จะพร้อมใช้งานสำหรับรายการสื่อทั้งหมด (ตัวอย่างเช่น เมื่อ เฟรมเวิร์กยังไม่รองรับรหัส) ในทางกลับกัน Media ID จะใช้งานได้เสมอ ไม่แนะนำให้ไคลเอ็นต์ใช้ URI เพื่อเลือกรายการจาก เซสชัน MediaBrowser ปัจจุบัน แต่ให้ใช้playFromMediaId
แทน อย่างไรก็ตาม ไม่จำเป็นสำหรับแอปที่แสดง และ URI ที่ขาดหายไปจะสงวนไว้สำหรับกรณีที่เหมาะสมการออกแบบเริ่มต้นใช้โคลอนตัวเดียวแทนลำดับ
://
หลังส่วนรูปแบบ อย่างไรก็ตาม ประเภทแรกจะไม่รองรับandroid.net.Uri
สำหรับการอ้างอิง URI แบบสัมบูรณ์แหล่งที่มาประเภทอื่นๆ
แหล่งที่มาอื่นๆ ของเสียงก็ได้รับการจัดการในลักษณะที่คล้ายกัน ตัวอย่างเช่น อินพุตเสริมและ เครื่องเล่นซีดีเสียง
แอปเดียวอาจแสดงแหล่งที่มาได้หลายประเภท ในกรณีดังกล่าว แนะนำให้คุณสร้าง MediaBrowserService แยกต่างหากสำหรับ แหล่งที่มาแต่ละประเภท แม้แต่ในการตั้งค่าที่มีแหล่งที่มา/MediaBrowserServices ที่แสดงหลายแหล่ง มีแนะนำอย่างยิ่งให้มี MediaSession 1 เซสชันภายใน แอป
ซีดีเพลง
เช่นเดียวกับ Audio CD ซึ่งแอปที่ให้บริการดิสก์ดังกล่าวจะ แสดง MediaBrowser ด้วยรายการที่เรียกดูได้รายการเดียว (หรือมากกว่า ถ้าระบบมี ตัวเปลี่ยน CD) ซึ่งจะมีแทร็กทั้งหมดของซีดีที่ระบุ หากระบบ ไม่มีความรู้เกี่ยวกับแทร็กในซีดีทุกแผ่น (เช่น เมื่อ จะใส่ตลับใส่ตลับหมึกในครั้งเดียว และไม่ได้อ่านค่าทั้งหมด) MediaItem สำหรับดิสก์ทั้งหมดจะเป็น
PLAYABLE
เท่านั้น ไม่ใช่BROWSABLE
บวกPLAYABLE
หากไม่มีดิสก์ใน ช่องโฆษณาที่กำหนด รายการจะไม่ใช่ทั้งPLAYABLE
หรือBROWSABLE
(แต่ช่องโฆษณาแต่ละช่องจะต้องแสดงอยู่ในแผนผังเสมอ)วันที่ รูปที่ 3 โครงสร้างแผนผังซีดีเสียง ระบบจะทำเครื่องหมายรายการเหล่านี้ในลักษณะเดียวกันกับที่ประกาศโฟลเดอร์วิทยุ ได้แก่ โดยจะมีฟิลด์เพิ่มเติมที่กำหนดไว้ใน MediaDescription API:
EXTRA_CD_TRACK
: สำหรับทุกๆMediaItem
ของซีดีเพลง หมายเลขแทร็กแบบอิง 1 รายการEXTRA_CD_DISK
: หมายเลขดิสก์ที่อิงตาม 1
สำหรับระบบที่เปิดใช้ CD-Text และดิสก์ที่เข้ากันได้ MediaItem ระดับบนสุดจะ มีชื่อดิสก์ ในทำนองเดียวกัน MediaItems สำหรับแทร็กจะมี ของแทร็ก
อินพุตเสริม
แอปที่ให้บริการอินพุตเสริมจะแสดงแผนผัง MediaBrowser ด้วยรายการเดียว (หรือหลายเพิ่มเติม เมื่อมีพอร์ตหลายพอร์ต) ซึ่งแสดง AUX ในพอร์ต MediaSession ที่เกี่ยวข้องจะ mediaId และเปลี่ยนเป็นแหล่งที่มานั้นหลังจากได้รับคำขอ
playFromMediaId
วันที่ รูปที่ 4 โครงสร้างแผนผัง AUX รายการ AUX MediaItem แต่ละรายการจะมีช่องเพิ่มเติม 1 ช่อง ตั้งค่า
EXTRA_AUX_PORT_NAME
เป็นชื่อที่ไม่ได้แปลเป็นภาษาท้องถิ่นของพอร์ต ไม่มี "AUX" วลี เช่น "AUX 1" ควรตั้งค่าเป็น "1", "AUX ด้านหน้า" เป็น "ด้านหน้า" และ "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
- ABC 88.1 (เล่นได้) URI:
broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
- ABC 88.1 HD1 (เล่นได้) URI:
broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
- ABC 88.1 HD2 (เล่นได้) URI:
broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
- 90.5 FM (เล่นได้) - FM ที่ไม่มี RDSuri:
broadcastradio://program/AMFM_FREQUENCY/90500
- URI เวลา 620 น. (เล่นได้):
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"
- URI เวลา 530 น. (เล่นได้:
broadcastradio://program/AMFM_FREQUENCY/530
) - URI เวลา 540 น. (เล่นได้:
broadcastradio://program/AMFM_FREQUENCY/540
) - URI เวลา 550 น. (เล่นได้:
broadcastradio://program/AMFM_FREQUENCY/550
)
- URI เวลา 530 น. (เล่นได้:
- FM (เรียกดูและเล่นได้):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
- URI ของ 87.7 FM (เล่นได้:
broadcastradio://program/AMFM_FREQUENCY/87700
) - URI ของ 87.9 FM (เล่นได้:
broadcastradio://program/AMFM_FREQUENCY/87900
) - URI ของ 88.1 FM (เล่นได้:
broadcastradio://program/AMFM_FREQUENCY/88100
)
- URI ของ 87.7 FM (เล่นได้:
- DAB (เล่นได้):
EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"
Audio CD 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 (เล่นได้)
- ซีดีเพลงของฉัน (เรียกดูและเล่นได้)
EXTRA_CD_DISK=3
- เล่นคนเดียว (เล่นได้)
EXTRA_CD_TRACK=1
- Reise, Reise (เล่นได้)
EXTRA_CD_TRACK=2
- เล่นคนเดียว (เล่นได้)
- ช่องว่าง 4 (เล่นไม่ได้)
EXTRA_CD_DISK=4
AUX MediaBrowserService (แฮนเดิล
ACTION_PLAY_AUX
):- ด้านหน้า AUX (เล่นได้)
EXTRA_AUX_PORT_NAME="front"
- ด้านหลัง AUX (เล่นได้)
EXTRA_AUX_PORT_NAME="rear"