Apps foundation

รถยนต์คือผืนผ้าใบ: ปลดล็อกการพัฒนา Android สำหรับการเดินทาง

ลำโพง

เกี่ยวกับ

เกี่ยวกับการเสวนา

เมื่อจอแสดงผลในรถยนต์ขยายไปยังยานพาหนะที่ใช้ Android Auto และ Android Automotive OS นักพัฒนาแอปต้องเผชิญกับความท้าทาย 2 ประการที่ไม่เหมือนใคร นั่นคือการมอบประสบการณ์การใช้งานที่สมบูรณ์และปรับเปลี่ยนได้ขณะจอดรถ และประสบการณ์การใช้งานที่ปลอดภัยสำหรับผู้ขับขี่และขับเคลื่อนด้วยเทมเพลตขณะขับรถ ในเซสชันทางเทคนิคที่ครอบคลุมระยะเวลา 30 นาทีนี้ เราจะสำรวจสถาปัตยกรรมแบบครบวงจรและแนวทางการพัฒนาเพื่อปรับแอป Android ให้เหมาะกับรถยนต์

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

สรุป

  • Android สำหรับรถยนต์กำหนดเป้าหมายเป็น 2 แพลตฟอร์ม ได้แก่ Android Auto และ Android Automotive OS โดยวิธีแรกจะฉายภาพจากโทรศัพท์ ส่วนอีกวิธีจะทำงานบนยานพาหนะโดยตรง
  • คลังแอปสำหรับรถยนต์มีเทมเพลตสำหรับอินเทอร์เฟซที่เพิ่มประสิทธิภาพสำหรับการขับขี่ซึ่งปรับให้เข้ากับการกำหนดค่าฮาร์ดแวร์ของรถยนต์ต่างๆ
  • แอปสำหรับรถที่จอดอยู่จะใช้กิจกรรม Android มาตรฐานเพื่อมอบประสบการณ์การใช้งานที่สมบูรณ์ เช่น สตรีมมิงวิดีโอ เกม และเว็บเบราว์เซอร์
  • คลังแอปสำหรับรถยนต์ 1.9 มาพร้อมคอมโพเนนต์ UI ใหม่และโทเค็นการปรับแต่งแบรนด์ นอกจากนี้ ยังขยายการรองรับเทมเพลตสื่อไปยัง Android Automotive OS อย่างเต็มรูปแบบด้วย
  • ความสามารถในการเล่นสื่อเมื่อจอดรถและขับรถจะเปิดกิจกรรมวิดีโอแบบเนทีฟแบบไดนามิกเมื่อจอดรถ จากนั้นจะเปลี่ยนกลับไปใช้เทมเพลตสื่อเพื่อรักษาเสียงให้เล่นได้อย่างต่อเนื่องเมื่อขับรถ

แหล่งข้อมูล

Gemini Notebook

หัวข้อ

  • android-for-cars
  • android-auto
  • android-automotive-os
  • car-app-library
  • media3
  • parked-apps

ข้อความถอดเสียง

ข้อมูลเบื้องต้นเกี่ยวกับ 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

  • คุณมีทักษะในการสร้างแอปสำหรับระบบนิเวศนี้อยู่แล้ว และรถยนต์หลายล้านคันก็กำลังรอแอปของคุณอยู่ ดังนั้นมาทำให้แอปของคุณพร้อมใช้งานบนท้องถนนกันเถอะ

รหัส

ข้อมูลโค้ด

ตัวอย่าง Shell ที่นาที 09:03 ใน "การพัฒนาแอปสำหรับรถที่จอดอยู่"
android skills list
android skills add android-for-cars-parked-apps
ข้อมูลโค้ด Kotlin ที่ 15:20 ใน "ความสามารถในการจอดรถเพื่อขับ"
override fun onStart() {
       super.onStart()
       ...
       controllerFuture = MediaController.Builder(
         this,
         sessionToken
       ).buildAsync()

       controllerFuture?.addListener({
           mediaController = controllerFuture?.get()
           playerView.player = mediaController
       }, ContextCompat.getMainExecutor(this))
}
ข้อมูลโค้ด Kotlin ที่ 16:06 ใน "ความสามารถในการเปลี่ยนจากโหมดจอดเป็นโหมดขับ"
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()
ข้อมูลโค้ด XML ที่ 16:42 ใน "ความสามารถในการเปลี่ยนจากโหมดจอดเป็นโหมดขับ"
<activity
   android:name=".VideoPlayerActivity"
   android:exported="false"
   android:launchMode="singleTop">
   <meta-data
       android:name="distractionOptimized"
       android:value="false" />
</activity>
ข้อมูลโค้ด Kotlin ที่ 17:17 ใน "การจัดการการเปลี่ยนจากจอดเป็นขับ"
class VideoPlayerActivity : ComponentActivity(){
  override fun onStart() {

    …

    if (uxRestrictionsManager?
        .currentCarUxRestrictions?
        .isRequiresDistractionOptimization
            == true) {
      revertToCarAppTemplate()
    }
  }

  private fun revertToCarAppTemplate() {
    mediaControllerCompat
      .sendCommand("CMD_CLEAR_VIDEO_SURFACE",
                   null, null)
    finish()
  }
}
ข้อมูลโค้ด XML ที่ 17:36 ใน "การจัดการการเปลี่ยนจากจอดเป็นขับ"
<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>
ข้อมูลโค้ด Kotlin ที่ 17:49 ใน "การจัดการการเปลี่ยนจากจอดเป็นขับ"
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)
    }
}