เมื่อจอแสดงผลในรถยนต์ขยายไปยังยานพาหนะที่ใช้ Android Auto และ Android Automotive OS นักพัฒนาแอปต้องเผชิญกับความท้าทาย 2 ประการที่ไม่เหมือนใคร นั่นคือการมอบประสบการณ์การใช้งานที่สมบูรณ์และปรับเปลี่ยนได้ขณะจอดรถ และประสบการณ์การใช้งานที่ปลอดภัยสำหรับผู้ขับขี่และขับเคลื่อนด้วยเทมเพลตขณะขับรถ ในเซสชันทางเทคนิคที่ครอบคลุมระยะเวลา 30 นาทีนี้ เราจะสำรวจสถาปัตยกรรมแบบครบวงจรและแนวทางการพัฒนาเพื่อปรับแอป Android ให้เหมาะกับรถยนต์
คุณจะได้เรียนรู้ทุกสิ่งที่จำเป็นสำหรับการนำแอปไปใช้ในรถยนต์ ตั้งแต่พื้นฐานการออกแบบแอปสำหรับใช้ในรถยนต์ไปจนถึงแนวทางใหม่ล่าสุดในการสร้างประสบการณ์การใช้งานสื่อที่เปลี่ยนจากเสียงเป็นวิดีโอเมื่อรถเปลี่ยนจากโหมดขับเป็นโหมดจอด
ข้อความถอดเสียง
โอเค
ขอต้อนรับทุกคน
ขอขอบคุณที่เข้าร่วมเซสชัน "รถยนต์คือผืนผ้าใบของคุณ"
เซสชันนี้จะพูดถึงการปลดล็อกการพัฒนา Android สำหรับการใช้งานบนท้องถนน
ผม Paul Lammertsma
และผมชื่อ Thomas Weathers
เราเป็นวิศวกรนักพัฒนาซอฟต์แวร์สัมพันธ์ในทีม Android สำหรับรถยนต์
เรามั่นใจว่าหลายๆ คนทุ่มเทเวลาและพลังงานอย่างมากเพื่อให้แอปดูดีและทำงานได้อย่างสวยงามในหน้าจอและอุปกรณ์ที่หลากหลาย ทั้งโทรศัพท์ อุปกรณ์แบบพับได้ แท็บเล็ต และอื่นๆ
วันนี้เราจะมาพูดถึงหน้าจอที่คุณอาจไม่เคยนึกถึงมาก่อน
และยังช่วยให้คุณเข้าถึงผู้ใช้ด้วยวิธีที่ไม่เหมือนใครได้ด้วย
นั่นคือจอแสดงผลในรถยนต์
เรามาเริ่มกันที่ภาพรวมคร่าวๆ ของความหมายเมื่อเราพูดถึง Android สำหรับรถยนต์
Android สำหรับรถยนต์ไม่ได้มีเพียงรูปแบบเดียว
คุณกำหนดเป้าหมายได้ 2 แพลตฟอร์ม
ระบบแรกคือ Android Auto ซึ่งเป็นระบบที่ฉายภาพจากโทรศัพท์
เมื่อใช้ Android Auto แอปจะทำงานบนโทรศัพท์และฉาย UI ไปยังจอแสดงผลในรถยนต์โดยใช้การเชื่อมต่อแบบใช้สายหรือแบบไร้สาย
และ 2 คือ Android Automotive OS ซึ่งเป็น Android เวอร์ชันหนึ่งที่ทำงานบนยานพาหนะโดยตรง
Android Automotive OS ทำงานแยกจากโทรศัพท์ มีสิทธิ์เข้าถึงฮาร์ดแวร์ของยานพาหนะโดยตรง เช่น ระบบปรับอากาศและวิทยุ และที่สำคัญคือยังจัดการการเชื่อมต่ออินเทอร์เน็ตของตัวเองด้วย
รถยนต์บางรุ่นที่ใช้ Android Automotive OS เป็นรถยนต์ที่มาพร้อมแอปและบริการของ Google
รถยนต์ที่มาพร้อมแอปและบริการของ Google ยังมาพร้อมแอปและบริการของ Google เช่น Play Store, Gemini และ Google Maps ด้วย
แม้ว่าจะมี 2 แพลตฟอร์ม แต่เป้าหมายของเราคือการช่วยให้คุณสร้างแอปเพียงครั้งเดียวและสามารถติดตั้งใช้งานแอปที่มอบประสบการณ์ที่ยอดเยี่ยมในทั้ง 2 แพลตฟอร์มได้
ต่อไปนี้เป็นตัวอย่างแอปสื่อที่สร้างขึ้นโดยใช้ไลบรารีแอปสำหรับรถยนต์ และหน้าตาของแอปทั้งใน Android Auto และ Android Automotive OS บนจอแสดงผลขนาดและรูปร่างต่างๆ
คุณสามารถสร้างแอปสำหรับอุปกรณ์และแพลตฟอร์มประเภทต่างๆ ได้มากมาย
ดังนั้นจึงเกิดคำถามว่า แล้วทำไมจึงต้องใช้กับรถยนต์
อย่างแรกเลยคือขนาดของที่นี่ใหญ่มาก
ปัจจุบันมีรถยนต์ที่รองรับ Android Auto มากกว่า 250 ล้านคันบนท้องถนน และมีรถยนต์ที่มาพร้อมแอปและบริการของ Google มากกว่า 100 รุ่นจาก 16 แบรนด์
และเมื่อแอปของคุณอยู่ในรถยนต์ คุณจะเข้าถึงผู้ใช้ได้ในระหว่างการเดินทางไปกลับจากที่ทำงานในแต่ละวัน ไปกลับจากกิจกรรมของครอบครัว ทำธุระ และแม้แต่การเดินทางท่องเที่ยว
ในสหรัฐอเมริกา ข้อมูลจากแบบสำรวจการขับขี่ของชาวอเมริกันปี 2024 โดย AAA ระบุว่าผู้ขับขี่ใช้เวลาอยู่หลังพวงมาลัยเฉลี่ย 60 นาทีต่อวัน
แต่คุณไม่ได้เข้าถึงผู้ใช้เฉพาะในขณะที่ขับรถอยู่เท่านั้น
นอกจากนี้ คุณยังเข้าถึงผู้ใช้ได้เมื่อจอดรถอยู่
ลองนึกภาพว่าผู้ฟังอาจกำลังชาร์จรถที่สถานีชาร์จ EV หรืออาจกำลังต่อแถวรอรับลูกที่โรงเรียน
และด้วยการเพิ่มขึ้นของจอแสดงผลสำหรับผู้โดยสารโดยเฉพาะ เราคาดว่าจะเห็นโอกาสมากขึ้นในอนาคตในการกระตุ้นการมีส่วนร่วมกับผู้ใช้
โอเค
ทีนี้มาดูประสบการณ์ประเภทต่างๆ ที่คุณสร้างขึ้นสำหรับรถยนต์ได้กัน
หากต้องการทำความเข้าใจวิธีสร้างแอปสำหรับรถยนต์ คุณควรทำความเข้าใจสถานการณ์และสถานะหลัก 2 อย่างที่มีอยู่สำหรับแอปเมื่อทำงานภายในรถยนต์
ประเภทแรกคือแอปที่คุณใช้ขณะขับรถ
ซึ่งเป็นประสบการณ์การใช้งานที่เพิ่มประสิทธิภาพเพื่อการขับรถและสามารถใช้ได้ขณะที่รถกำลังเคลื่อนที่
ซึ่งรวมถึงแอปในหมวดหมู่ที่คุณเห็นในรายการบนหน้าจอ เช่น แอปเสียง ซึ่งเรามักเรียกว่าแอปสื่อ แอปการรับส่งข้อความและการสื่อสาร แอปการนำทาง และอื่นๆ
ประสบการณ์การใช้งานที่เพิ่มประสิทธิภาพสำหรับการขับขี่ต้องเป็นไปตามเกณฑ์การป้องกันสิ่งรบกวนสมาธิที่เข้มงวด
มีข้อควรพิจารณาพิเศษเกี่ยวกับวิธีสร้าง UI สำหรับแอปเพื่อให้ใช้งานได้อย่างปลอดภัยขณะที่รถกำลังเคลื่อนที่
ปัจจุบันมีวิธีสร้างแอปที่เพิ่มประสิทธิภาพสำหรับการขับขี่อยู่ 2 วิธี
แต่ในการพูดคุยครั้งนี้ เราจะเน้นที่การใช้ Car App Library
นี่คือชุดไลบรารี Jetpack ที่มีเฟรมเวิร์กเทมเพลตซึ่งมีอินเทอร์เฟซผู้ใช้ที่เพิ่มประสิทธิภาพสำหรับการขับขี่ ขณะเดียวกันก็ดูแลการปรับให้เข้ากับการกำหนดค่าฮาร์ดแวร์ต่างๆ ที่มีอยู่ในรถยนต์ด้วย
ดังนั้นให้พิจารณาปัจจัยต่างๆ เช่น รูปแบบการป้อนข้อมูล ขนาดหน้าจอ และสัดส่วนภาพ
แม้ว่านี่จะไม่ใช่วิธีเดียวในการสร้างประสบการณ์การใช้งานที่เพิ่มประสิทธิภาพสำหรับการขับขี่รถยนต์ แต่วิธีที่ฉันต้องการเน้นในการพูดคุยครั้งนี้คือการสร้างด้วยไลบรารีแอป Android สำหรับรถยนต์
เรามักเรียกสั้นๆ ว่า CAL
ตามที่ได้กล่าวไปก่อนหน้านี้ Car App Library คือชุดไลบรารีที่ช่วยสร้างแอปสำหรับใช้ในยานพาหนะ
ซึ่งเป็นเฟรมเวิร์กแบบเทมเพลตที่มอบอินเทอร์เฟซผู้ใช้ที่เพิ่มประสิทธิภาพสำหรับการขับขี่ พร้อมทั้งจัดการงานปรับให้เข้ากับการกำหนดค่าฮาร์ดแวร์ต่างๆ
และคุณสามารถสร้างแอปและมั่นใจได้ว่าแอปจะมีประสิทธิภาพดีในการกำหนดค่าที่หลากหลายทั้งหมด ไม่ว่าจะทำงานใน Android Auto หรือ Android Automotive OS
แอปที่สร้างโดยใช้ CAL จะใช้สถาปัตยกรรมไคลเอ็นต์โฮสต์นี้ได้
แอปโฮสต์ ซึ่งก็คือ Android Auto เองหรือ Google Automotive App Host ในกรณีของรถยนต์ที่มาพร้อมแอปและบริการของ Google จะเป็นตัวแสดงผลของระบบ
ซึ่งจะควบคุมสิ่งที่ต้องแสดงต่อผู้ใช้บนจอแสดงผลในท้ายที่สุด
ดังนั้นในฐานะนักพัฒนาแอป คุณจึงไม่ได้เป็นผู้กำหนดพิกเซลในท้ายที่สุด
แต่คุณกำลังป้อนข้อมูลที่มีโครงสร้างและสถานะของข้อมูลไปยังเทมเพลต Car App Library
และโฮสต์นี้จะนำข้อมูลนี้ไปแสดงอย่างปลอดภัยในลักษณะที่สอดคล้องกับความปลอดภัย โดยใช้เลย์เอาต์ที่เพิ่มประสิทธิภาพเพื่อลดการเสียสมาธิ
มาดูคลาสภายใน CAL กันว่าคุณต้องขยายอะไรบ้างเพื่อสร้างแอป โดยเริ่มจาก CarAppService
นี่คือคลาสย่อยของบริการ Android ที่ทำหน้าที่เป็นจุดแรกเข้าสำหรับแอปพลิเคชันแบบโฮสต์เพื่อสื่อสารกับแอปไคลเอ็นต์ และมีวัตถุประสงค์เพื่อสร้างอินสแตนซ์เซสชันที่โฮสต์จะโต้ตอบด้วย
คุณสามารถมองว่าเซสชันเป็นอินสแตนซ์ของแอปไคลเอ็นต์ที่ทำงานบนจอแสดงผลในยานพาหนะ
เช่นเดียวกับคอมโพเนนต์อื่นๆ ของ Android โดยมีวงจรของตัวเองที่สามารถใช้เพื่อเริ่มต้นและแยกทรัพยากรที่ใช้ตลอดการมีอยู่ของอินสแตนซ์ของเซสชัน
ซึ่งเป็นความสัมพันธ์แบบ 1 ต่อหลายระหว่าง CarAppService กับเซสชัน
ตัวอย่างเช่น CarAppService อาจมีอินสแตนซ์เซสชัน 2 รายการ โดยรายการหนึ่งสำหรับจอแสดงผลหลัก และอีกรายการหนึ่งสำหรับจอแสดงผลแผงหน้าปัดสำหรับแอปการนำทางที่รองรับหน้าจอแผงหน้าปัด
และนี่คือตัวอย่างของกรณีดังกล่าว โดยรถยนต์มีจอแสดงผลหลักและจอแสดงผลแผงหน้าปัด ซึ่งจอแสดงผลแต่ละจอจะเชื่อมโยงกับเซสชันเฉพาะ และนี่คือวิธีที่คุณในฐานะนักพัฒนาแอปสามารถรองรับรถยนต์ที่มีจอแสดงผลหลายจอได้
จากนั้นภายในเซสชัน อินสแตนซ์หน้าจอจะรับผิดชอบในการสร้างอินเทอร์เฟซผู้ใช้ที่แสดงผลโดยแอปโฮสต์
อินเทอร์เฟซผู้ใช้เหล่านี้แสดงโดยคลาสเทมเพลตที่แต่ละคลาสจำลองเลย์เอาต์ประเภทหนึ่งๆ เช่น ตารางกริดหรือรายการ
ดังนั้น แต่ละเซสชันจะจัดการสแต็กของอินสแตนซ์หน้าจอที่จัดการโฟลว์ผู้ใช้ในส่วนต่างๆ ของแอปพลิเคชัน และหน้าจอจะมีวงจรของตัวเองที่คุณสามารถเชื่อมโยงได้เช่นเดียวกับเซสชัน
แต่การที่โฮสต์แสดงผล UI ของคุณ และคุณใช้เทมเพลต Car App Library ไม่ได้หมายความว่าคุณถูกจำกัดอย่างเข้มงวด หรือคุณไม่สามารถปรับแต่งแอปพลิเคชันของคุณได้
มีเทมเพลตและคอมโพเนนต์มากมายที่คุณใช้ได้ และยังสามารถผสมผสานเพื่อให้ได้ประสบการณ์การใช้งานที่ต้องการได้ด้วย
เทมเพลตอเนกประสงค์สามารถใช้ได้กับแอปทุกประเภทภายในคลังแอปสำหรับรถยนต์ และเทมเพลตเพื่อวัตถุประสงค์พิเศษมีไว้สำหรับประสบการณ์การใช้งานแอปที่เฉพาะเจาะจง เช่น การนำทางหรือจุดที่น่าสนใจ
แต่ก่อนที่จะลงรายละเอียดเกี่ยวกับการสร้างประสบการณ์การใช้งานที่เพิ่มประสิทธิภาพสำหรับการขับขี่ เราอยากพูดถึงอีกสถานการณ์หนึ่งที่คุณสามารถเรียกใช้แอปพลิเคชันในรถยนต์ได้ นั่นคือเมื่อรถจอดอยู่
แอปพลิเคชันบางหมวดหมู่จะใช้ได้เฉพาะขณะที่รถจอดอยู่เท่านั้น ซึ่งรวมถึงแอปวิดีโอ เกม และเบราว์เซอร์
แต่เมื่อรถไม่ได้เคลื่อนที่ หลักเกณฑ์การเสียสมาธิของผู้ขับจะถูกยกเลิก และคุณสามารถมอบประสบการณ์การใช้งานที่สอดคล้องกับ UI แบบปรับอัตโนมัติที่มีอยู่ได้มากขึ้น
แอปที่ใช้ขณะจอดรถจะอิงตามกิจกรรม และคล้ายกันหรือเหมือนกันกับกิจกรรมที่ใช้ในอุปกรณ์อื่นๆ เช่น โทรศัพท์หรือแท็บเล็ต โดยเราจะพูดถึงแอปที่ใช้ขณะจอดรถโดยละเอียดในส่วนถัดไป
แม้ว่าประสบการณ์การใช้งานแอปขณะจอดจะใช้กิจกรรมแบบปรับเปลี่ยนได้ที่มีอยู่ซ้ำ แต่ก็ยังมีหลักเกณฑ์ด้านคุณภาพเฉพาะสำหรับรถยนต์ที่คุณต้องปฏิบัติตาม ตั้งแต่การประกาศไฟล์ Manifest และหน้าจอรอยบาก ไปจนถึงการหยุดเล่นชั่วคราวเมื่อรถเริ่มเคลื่อนที่
และเพื่อช่วยให้งานดังกล่าวเป็นแบบอัตโนมัติ เราจึงได้เปิดตัวทักษะใหม่ของ Android สำหรับแอปสำหรับจอดรถ
ดังนั้นก่อนเริ่มต้นใช้งาน โปรดตรวจสอบว่าคุณได้ติดตั้ง Android CLI แล้ว ซึ่งดูได้จากลิงก์แบบย่อนี้
และเมื่อตั้งค่าเสร็จแล้ว ให้เรียกใช้ android skills list เพื่อสำรวจทักษะที่มี
android skills list
android skills add android-for-cars-parked-appsมีทักษะต่างๆ มากมายที่คุณสามารถใช้เพื่อยกระดับการพัฒนา Android ไปอีกขั้น
และสำหรับ Android สำหรับรถยนต์โดยเฉพาะ คุณสามารถใช้ android skills add android-for-cars-parked-apps เพื่อเพิ่มทักษะลงในบริบทของ Agent ได้
ตอนนี้ ไม่ว่าคุณจะใช้ AI Agent ตัวใดก็ตาม ระบบจะให้คำแนะนำทีละขั้นตอนในการกำหนดค่าไฟล์ Manifest สำหรับ Android Auto หรือ Android Automotive OS, การจัดการส่วนแทรกของหน้าต่างรถยนต์และสิ่งต่างๆ เช่น การนำทางย้อนกลับ, การบังคับใช้ข้อจำกัดการเล่นเพื่อป้องกันการเสียสมาธิของผู้ขับ และยังตรวจสอบแอปวิดีโอ เกม หรือเบราว์เซอร์ก่อนที่คุณจะส่งไปยัง Google Play ได้ด้วย
ดังนั้น การสร้างแอปสำหรับรถยนต์จึงมีความเฉพาะตัวเล็กน้อยเนื่องจากแนวคิดเกี่ยวกับหมวดหมู่แอปเหล่านี้
ดังที่ได้กล่าวไปก่อนหน้านี้ แอปบางหมวดหมู่สามารถใช้ได้ขณะขับรถ และแอปหมวดหมู่อื่นๆ สามารถใช้ได้ขณะจอดรถ
หมวดหมู่ที่ไฮไลต์เหล่านี้คือหมวดหมู่ที่ใช้ได้ขณะขับรถ
บางแอปจะมีสัญลักษณ์ CAL ซึ่งหมายถึงไลบรารีแอปสำหรับรถยนต์ (Car App Library) และแอปในหมวดหมู่นี้จะใช้เทมเพลตเหมือนกับที่เราเห็นเมื่อสักครู่
เราจะอธิบายเรื่องนี้อย่างรวดเร็วโดยไม่ลงรายละเอียดมากนัก
เริ่มจากแอปสื่อ ซึ่งตอนนี้เป็นแอปที่เล่นเสียง ไม่ใช่วิดีโอ
ซึ่งสร้างได้ 2 วิธี
ตัวเลือกที่อยู่ด้านบนสุดซึ่งมีสัญลักษณ์ MediaBrowserService เป็นตัวเลือกที่ง่ายที่สุด
สิ่งที่คุณทำคือการให้ข้อมูลเมตา ในขณะที่อินเทอร์เฟซหน้าจอสาระบันเทิงจะดูแลการแสดงผล UI ของการเล่นและเบราว์เซอร์สื่อในลักษณะที่เพิ่มประสิทธิภาพให้กับรถยนต์อย่างเต็มรูปแบบ
อีกตัวเลือกหนึ่งคือการสร้างแอปสื่อโดยใช้ไลบรารีแอปสำหรับรถยนต์ ซึ่งจะช่วยให้คุณควบคุมและมีตัวเลือกมากขึ้นในการปรับแต่งสไตล์และการนำเสนอแอปสื่อของคุณ และ Thomas จะแสดงข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ให้เราดูในอีกสักครู่
แน่นอนว่าแอปการนำทางเป็นกรณีการใช้งานที่สำคัญ โดยจะแสดงเส้นทางและคำแนะนำแบบเลี้ยวต่อเลี้ยว
แอปคนขับรถร่วมเดินทางก็จัดอยู่ในหมวดหมู่นี้เช่นกัน
แอปสถานที่น่าสนใจช่วยให้คุณค้นหาตำแหน่งที่เป็นประโยชน์ในบริเวณใกล้เคียง เช่น ที่ชาร์จ EV หรือที่จอดรถ
แอปอินเทอร์เน็ตของสรรพสิ่งหรือ IoT ช่วยให้คุณเข้าถึงอุปกรณ์อัจฉริยะได้ทุกที่ทุกเวลา เช่น การจัดการบ้าน
นอกจากนี้ยังมีแอปสภาพอากาศที่สามารถแสดงเรดาร์แบบเรียลไทม์ การแจ้งเตือนพายุ และการพยากรณ์อากาศเฉพาะสถานที่
และสุดท้าย การสื่อสารแบ่งออกเป็น 3 หมวดหมู่ย่อย ได้แก่ การขยายการแจ้งเตือนพื้นฐานไปยังรถยนต์ หรือแอปพลิเคชันรับส่งข้อความและวิดีโอคอล
และยังมีหมวดหมู่ที่จอดรถ ได้แก่ แอปสตรีมมิง เกม และเว็บเบราว์เซอร์
และเรายินดีที่จะประกาศว่าตั้งแต่เมื่อไม่กี่สัปดาห์ที่ผ่านมา นักพัฒนาแอปทุกรายสามารถเผยแพร่เกมใน Android Auto และ Android Automotive OS ได้แล้ว
คุณจะเห็นว่าบางหมวดหมู่มีข้อความว่า "เปิด" บางหมวดหมู่มีข้อความว่า "อยู่ในเวอร์ชันเบต้า" และบางหมวดหมู่มีข้อความว่า "เร็วๆ นี้"
"เปิด" หมายความว่านักพัฒนาแอปทุกคนสามารถส่งแอปในหมวดหมู่นี้ไปยังเวอร์ชันที่ใช้งานจริงได้โดยตรง
เบต้าหมายความว่าแม้คุณจะเผยแพร่ไปยังแทร็กภายในหรือแทร็กแบบปิดได้ แต่จะเผยแพร่แอปเป็นเวอร์ชันที่ใช้งานจริงไม่ได้ เว้นแต่คุณจะได้รับการยอมรับให้เป็นส่วนหนึ่งของโปรแกรมทดลองใช้ก่อนเปิดตัว
เอกสารประกอบสำหรับแต่ละหมวดหมู่เหล่านี้มีข้อมูลเพิ่มเติมและลิงก์ไปยังแบบฟอร์มแสดงความสนใจ
และ "เร็วๆ นี้" มีไว้สำหรับหมวดหมู่ที่ยังไม่รองรับในปัจจุบัน แต่เรามีแผนที่จะรองรับในอนาคต
เป้าหมายสูงสุดของเราคือการรวมแพลตฟอร์มเข้าด้วยกัน
เราต้องการให้คุณสร้างและเข้าถึงผู้ใช้ได้มากที่สุดด้วยการเขียนโค้ดเพียงครั้งเดียวและเผยแพร่ไปยังทั้ง Android Auto และ Android Automotive OS ไม่ว่าจะเป็นหมวดหมู่ใดก็ตาม
ต่อไป Thomas จะมาพูดถึงสื่อ
ขอขอบคุณ
เยี่ยมมาก
ดังนั้นเมื่อปีที่แล้ว เราจึงเปิดตัวคลังแอปสำหรับรถยนต์สำหรับแอปสื่อในเวอร์ชัน 1.8 ซึ่งนำ UI การเรียกดูแบบเทมเพลตและการกระทำที่กำหนดเองมาสู่ Android Auto
ซึ่งรวมถึงเทมเพลตการเล่นสื่อที่แสดงทางด้านซ้าย
ในงาน I/O ปีนี้ เราได้เปิดตัว UI ที่เรียกดูได้มากขึ้นผ่าน Car App Library 1.9
เมื่อ CAL 1.9 เข้าสู่เวอร์ชันเบต้า คุณจะสามารถปลดล็อกการอัปเดตฟีเจอร์สำคัญใน Auto และ Automotive OS ได้
ไฮไลต์ต่างๆ ได้แก่ การปรับแต่งแบรนด์ผ่านการแสดงออกของแอป ซึ่งช่วยให้คุณปรับแต่งโทเค็นสีและรูปร่างด้วยเลย์เอาต์ที่แสดงผลโดยโฮสต์ได้โดยยังคงปฏิบัติตามกฎความปลอดภัย ควบคู่ไปกับคอมโพเนนต์ UI ใหม่ๆ เช่น ส่วนสปอตไลท์ รายการแบบย่อ ชิปที่เลื่อนได้ และมินิเพลเยอร์แบบถาวร
นอกจากนี้ CAL 1.9 ยังขยายการรองรับเทมเพลตสื่อไปยัง AAOS อย่างเต็มรูปแบบ ซึ่งช่วยขับเคลื่อนการรวมแพลตฟอร์มอย่างแท้จริงในทั้ง 2 ระบบนิเวศ
เราจะเปิดตัวคลังแอปสำหรับรถยนต์เวอร์ชันถัดไปในเร็วๆ นี้ ซึ่งก็คือ CAL เวอร์ชัน 10
CAL เวอร์ชัน 10 จะมีเทมเพลตที่กำหนดเองได้มากขึ้นสำหรับแอปการสื่อสาร ซึ่งจะมอบประสบการณ์การโทรที่เสถียรและปรับแต่งได้มากขึ้นขณะขับรถ
นอกจากนี้ เรายังเพิ่มหมวดหมู่แอปใหม่และเทมเพลตสำหรับแอปที่มีประสบการณ์การสนทนาขณะขับรถด้วย
สุดท้ายนี้ เรากำลังพัฒนาฟังก์ชันการทำงานเพิ่มเติมเพื่อการเปลี่ยนจากโหมดจอดรถเป็นโหมดขับรถที่ราบรื่นยิ่งขึ้นด้วยเทมเพลต Car App Library
รอติดตามข้อมูลเพิ่มเติมเร็วๆ นี้
ความสามารถในการเปลี่ยนโหมดจอดรถเป็นโหมดขับรถโดยใช้ไลบรารีแอปสำหรับรถยนต์ช่วยให้แอปเปลี่ยนโหมดแบบไดนามิกและแสดงเนื้อหาที่ปรับเปลี่ยนได้ขณะจอดนิ่ง และเปลี่ยนกลับไปใช้เทมเพลตไลบรารีแอปสำหรับรถยนต์ได้อย่างราบรื่นเมื่อขับรถ
แอปพลิเคชันหลักๆ ได้แก่ การนำเสนอขั้นตอนการตรวจสอบสิทธิ์ที่ปรับแต่งมาโดยเฉพาะเมื่อคุณอยู่กับที่ หรือการเปิดใช้ประสบการณ์การจอดรถโดยเฉพาะเมื่อคุณอยู่กับที่ เช่น การสตรีมวิดีโอพอดแคสต์หรือคลิปเพลง
ซึ่งจะผสานรวมกับเทมเพลตการเล่นสื่อโดยตรง
ดังนั้น ยานพาหนะที่จอดอยู่จะให้สิทธิ์ผู้ขับขี่เข้าถึงกิจกรรม Android แบบเนทีฟของแอปได้อย่างเต็มรูปแบบ ซึ่งช่วยให้สามารถใช้สื่อสมบูรณ์ เช่น สตรีมมิงวิดีโอได้
ทันทีที่รถเข้าเกียร์ ระบบป้องกันสิ่งรบกวนจะทำงาน ซึ่งจะแจ้งให้แอปเปลี่ยนกลับไปใช้เทมเพลตสื่อของคลังแอปสำหรับรถยนต์ เพื่อให้สอดคล้องกับนโยบายและฟังเสียงได้อย่างต่อเนื่อง
เรากำลังอยู่ในช่วงเวลาแห่งการเปลี่ยนแปลงสำหรับประสบการณ์การใช้งานในรถยนต์
แอปสื่อต้องการพัฒนาให้เหนือกว่าอินเทอร์เฟซการเรียกดูและการเล่นแบบเดิมๆ เพื่อมอบช่วงเวลาที่สมบูรณ์ ดื่มด่ำ และโต้ตอบได้มากขึ้นสำหรับทั้งผู้ขับขี่และผู้โดยสาร
ตอนนี้เราจะเจาะลึกตัวอย่างวิธีเพิ่มกิจกรรมวิดีโอแบบเนทีฟโดยใช้ไลบรารี Media3 เพื่อเริ่มเล่นเมื่อรถเปลี่ยนเป็นโหมดจอด
ในการเริ่มต้น คุณจะต้องเชื่อมต่อพื้นผิวการแสดงผลวิดีโอกับอินสแตนซ์การเล่นขณะล็อกหน้าจอหรือขณะใช้แอปอื่นโดยตรง
override fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}คุณต้องการหลีกเลี่ยงการสร้างอินสแตนซ์มีเดียเพลเยอร์แยกต่างหากภายในกิจกรรมนี้ แต่ต้องการคง ExoPlayer หรือมีเดียเพลเยอร์ส่วนกลางไว้ภายในบริการหลัก เช่น บริการคลังสื่อ Media3 ซึ่งจัดการร่วมกับทั้งสตรีมเสียงและวิดีโอ
ดังนั้นในระหว่างการเคลื่อนที่ เมื่อไม่มีบริการที่ใช้งานอยู่เชื่อมโยงอยู่ โปรแกรมเล่นจะถอดรหัสเฉพาะเสียง แต่เมื่อคนขับเปิดกิจกรรมวิดีโอเมื่อจอดรถ คุณจะต้องแนบพื้นผิวการแสดงผลกับโปรแกรมเล่นบริการที่เกี่ยวข้องโดยตรง
ดังนั้นเมื่อใช้ Media3 mediaController จะใช้เพลเยอร์แบบเนทีฟ ซึ่งช่วยให้กำหนดค่าได้โดยตรง ดังที่คุณเห็นที่นี่ playerView ตั้งค่า-- playerView.player ตั้งค่าเป็น mediaController โดยตรง
ดังนั้น ขั้นตอนถัดไปคือคุณจะต้องลงทะเบียนจุดแรกเข้าแบบเนทีฟโดยใช้ ParkedOnlyOnClickListener
val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()Wrapper นี้จะแสดงทริกเกอร์ Intent ภายในแถบส่วนหัวของอินเทอร์เฟซการเล่นสื่อ
ดังนั้น การรวมการดำเนินการเพื่อเริ่มเล่นวิดีโอ โดยรวม Listener การเลือกไว้ใน ParkedOnlyOnClickListener
ดังนั้นในโหมดขับรถ การแตะเหล่านี้จะถูกแอปโฮสต์สกัดกั้นไว้ ซึ่งจะแสดงข้อความด้านความปลอดภัยของระบบ คุณจึงไม่สามารถเข้าสู่หน้าจอดังกล่าวได้เมื่อขับรถ แต่เมื่อจอดรถแล้ว Callback จะทริกเกอร์ startActivity ภายใน carContext เพื่อเปิดกิจกรรมแบบเต็มหน้าจอที่กำหนดไว้
โปรดทราบว่าในแอปคลังแอปสำหรับรถยนต์เหล่านี้ คุณต้องแจ้งว่าเป้าหมายวิดีโอเป็น distractionOptimized=false ภายในไฟล์ Manifest เพื่อให้ระบบปฏิบัติการรับรู้ว่านี่เป็นเวิร์กโฟลว์ที่จอดรถเท่านั้น
<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>และสุดท้าย มาดูกันว่าจะเกิดอะไรขึ้นเมื่อคนขับเปลี่ยนจากเกียร์จอดเป็นเกียร์ขับ
หากกิจกรรมไม่ได้เพิ่มประสิทธิภาพเพื่อลดการเสียสมาธิ และยังคงทำงานอยู่ขณะที่รถเคลื่อนที่ AAOS จะแสดงการวางซ้อนการบล็อกของระบบซึ่งจะบอกให้คุณจอดรถเพื่อใช้แอปต่อไป
เพื่อหลีกเลี่ยงหน้าจอที่ถูกบล็อกนี้ เป้าหมายของเราคือการกลับไปที่เทมเพลตการเล่นสื่ออย่างราบรื่นโดยไม่รบกวนเสียง
ดังนั้นเมื่อ isRequiresDistractionOptimization ประเมินเป็น "จริง" ในที่นี้ เราจะล้างการแสดงผลพื้นผิวการแสดงผลวิดีโอจากเซสชันสื่อที่สำคัญของคุณ และเรียกใช้ "เสร็จสิ้น" ในกิจกรรมใน Google Play เนื่องจากกิจกรรมนี้เปิดขึ้นที่ด้านบนของประสบการณ์การใช้งาน CAL การดำเนินการให้เสร็จสิ้นจะกลับไปยังเทมเพลตการเล่นสื่อโดยตรงและเล่นเสียงต่อ
class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}การรักษาการเล่นเสียงอย่างต่อเนื่องเป็นกุญแจสำคัญในการมอบประสบการณ์ที่ยอดเยี่ยมแก่ผู้ใช้ ดังนั้นการทำให้เซสชันสื่อทำงานอยู่เป็นบริการที่ทำงานอยู่เบื้องหน้าจะช่วยให้เสียงเล่นอย่างต่อเนื่องและราบรื่นแม้จะมีการเปลี่ยนแปลงสถานะเหล่านี้
<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>นอกจากนี้ คุณควรลบล้าง onNewIntent ในหน้าจอ CAL เพื่อบันทึกความตั้งใจ SHOW_MEDIA_PLAYBACK ด้วย
class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}ด้วยวิธีนี้ เมื่อใดก็ตามที่ผู้ใช้โต้ตอบกับวิดเจ็ตสื่อของระบบยานพาหนะซึ่งอยู่บนหน้าจอหลักของรถยนต์ Deep Link จะนำผู้ใช้ไปยังมุมมอง "กำลังเล่น" ในคลังแอปของรถยนต์โดยตรง
ดังนั้นการตรวจสอบความถูกต้องของการเปลี่ยนผ่านเหล่านี้ตลอดกระบวนการพัฒนาจึงเป็นเรื่องง่ายมาก
คุณสามารถเรียกใช้คำสั่ง adb ใน AAOS ได้
ในกรณีนี้ ให้ใช้ emulate-driving-state drive หรือ emulate-driving-state park เมื่อคุณพร้อมที่จะสลับกลับไปมาระหว่างกิจกรรม
นี่คือตัวอย่างการใช้แอปสื่อ Media3 ตัวอย่างใหม่ของเราที่ใช้ไลบรารีแอปสำหรับรถยนต์พร้อมการเล่นวิดีโอแบบจอดรถเพื่อขับ
ลองไปดูที่บูธ Android แบบปรับเปลี่ยนได้ที่ชั้นล่างและใน GitHub ของ car-samples เร็วๆ นี้
ปัจจุบันความสามารถในการจอดรถเพื่อขับขี่พร้อมใช้งานใน Android Automotive OS สำหรับแอปสื่อที่ผสานรวมกับ CAL ของรถยนต์แล้วเพื่อประสบการณ์การขับขี่ที่สามารถมอบประสบการณ์ที่สมบูรณ์ยิ่งขึ้นขณะจอดรถได้แล้วตอนนี้
ดูข้อมูลนี้ในเอกสารประกอบของเราได้เร็วๆ นี้ที่ developer.android.com และแสดงความสนใจที่นั่นเพื่อนำฟีเจอร์นี้ไปใช้ในแอปของคุณ
Paul
เยี่ยมมาก
ขอบคุณ Thomas
ก่อนจะจบเซสชันนี้ เรามี 2 วิธีที่จะแชร์กับคุณเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่จะเกิดขึ้นในช่วงปลายปีนี้
ตามที่ Thomas กล่าวไว้ ปัจจุบัน CAL 1.9 อยู่ในเวอร์ชันอัลฟ่า
และจะพร้อมให้ใช้งานในเวอร์ชันเบต้าเร็วๆ นี้
และ CAL 1.10 จะเข้าสู่เวอร์ชันอัลฟ่าก่อนสิ้นปีนี้ เพื่อให้คุณเริ่มประเมิน UI แบบสนทนา รวมถึงความสามารถในการสื่อสารและเปลี่ยนจากโหมดจอดเป็นโหมดขับล่าสุดได้
สุดท้ายนี้ เราตื่นเต้นที่จะแชร์ว่าเกมพร้อมให้บริการใน Android Auto และ Android Automotive OS แล้วตามที่ได้กล่าวไป ดังนั้นนี่จึงเป็นช่วงเวลาที่เหมาะอย่างยิ่งในการเพิ่มประสิทธิภาพเกมสำหรับรถยนต์
ดูข้อมูลเพิ่มเติมเกี่ยวกับรายละเอียดการติดตั้งใช้งานได้ในเอกสารประกอบในคู่มือ "สร้างเกมสำหรับรถยนต์"
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีปรับเกมให้เหมาะกับรถยนต์และติดตามข่าวสารใหม่ๆ และการเปลี่ยนแปลงอื่นๆ เกี่ยวกับ Android สำหรับรถยนต์ได้ในหน้า "มีอะไรใหม่"
เราหวังว่าคุณจะเห็นแล้วว่ารถยนต์และผู้ใช้รถยนต์พร้อมสำหรับแอปของคุณแล้ว
คุณสามารถสร้างแอปที่ปรับเปลี่ยนได้ที่มีอยู่เพื่อประสบการณ์การใช้งานที่สมบูรณ์แบบขณะจอดรถ และใช้เทมเพลตคลังแอปสำหรับรถยนต์ที่หลากหลายเพื่อสร้างประสบการณ์การใช้งานที่เพิ่มประสิทธิภาพเพื่อการขับขี่ที่ปลอดภัย
ก่อนเผยแพร่ คุณสามารถทดสอบอย่างละเอียดโดยใช้เครื่องเล่นวิทยุบนเดสก์ท็อป, โปรแกรมจำลอง, AAOS ที่ทำงานบน Pixel Tablet หรือใช้ Firebase Test Lab
คุณมีทักษะในการสร้างแอปสำหรับระบบนิเวศนี้อยู่แล้ว และรถยนต์หลายล้านคันก็กำลังรอแอปของคุณอยู่ ดังนั้นมาทำให้แอปของคุณพร้อมใช้งานบนท้องถนนกันเถอะ
android skills list
android skills add android-for-cars-parked-appsoverride fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}