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

การใช้งานวิทยุบังคับอิงตาม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
รูปที่ 2 โครงสร้างแบบต้นไม้ MediaBrowserService

องค์ประกอบแต่ละรายการในแต่ละโฟลเดอร์เหล่านี้ (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 ต้องรองรับการใส่เลขหน้า ดังนี้

    หมายเหตุ: โดยค่าเริ่มต้น ระบบจะใช้การใส่เลขหน้าโดยค่าเริ่มต้นใน 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 จะ ไม่มีแท็กเฉพาะวิทยุ ดังนั้น ลูกค้าต้องการตรวจสอบว่า แหล่งที่มาพร้อมใช้งานในอุปกรณ์ ต้องมีลักษณะดังนี้

    1. สำรวจบริการวิทยุ (โทรหา resolveService สำหรับ ACTION_PLAY_BROADCASTRADIO)
    2. สร้าง MediaBrowser แล้วเชื่อมต่อ
    3. หาการมีอยู่ของ 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-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 เพื่อใช้กับคำสั่ง 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

    โครงสร้างแผนผัง AUX
    รูปที่ 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)
    • รายการโปรด (เรียกดูได้และเล่นได้)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"
      • URI เวลา 530 น. (เล่นได้: broadcastradio://program/AMFM_FREQUENCY/530)
      • URI เวลา 540 น. (เล่นได้: broadcastradio://program/AMFM_FREQUENCY/540)
      • URI เวลา 550 น. (เล่นได้: broadcastradio://program/AMFM_FREQUENCY/550)
    • 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)
    • 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
    • ซีดีเพลงของฉัน (เรียกดูและเล่นได้) 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"