เมื่อเผยแพร่แอปไปยังอุปกรณ์ Android Automotive OS คุณควรทราบถึงข้อควรพิจารณาบางประการที่เฉพาะเจาะจงกับอุปกรณ์รูปแบบนี้ ซึ่งคู่มือนี้จะอธิบายข้อควรพิจารณาเหล่านั้น
ทดสอบแอปที่มีอยู่บนโปรแกรมจำลอง Android Automotive OS
หากต้องการเริ่มสร้างแอปสำหรับ Android Automotive OS ให้ทดสอบแอปที่มีอยู่บนโปรแกรมจำลอง Android Automotive OS ก่อน โดยทำตาม ขั้นตอนในหัวข้อทดสอบโดยใช้โปรแกรมจำลอง Android Automotive OS เพื่อตั้งค่าโปรแกรมจำลอง จากนั้นคุณจะเรียกใช้แอปได้โดยทำตามวิธีการในหัวข้อ เรียกใช้แอปในโปรแกรมจำลอง
เมื่อเรียกใช้แอป ให้มองหาปัญหาความเข้ากันได้ เช่น ปัญหาต่อไปนี้
- หน้าจอสาระบันเทิงมีการวางแนวคงที่ แอปต้องรองรับทั้งการวางแนวแนวตั้งและแนวนอนเพื่อให้เป็นไปตามหลักเกณฑ์ด้านคุณภาพสำหรับแอป รถยนต์
- API ที่ใช้ได้ในอุปกรณ์อื่นๆ อาจใช้ไม่ได้ใน Android Automotive OS เช่น API บางรายการของบริการ Google Play ใช้ไม่ได้ใน Android Automotive OS ดูรายละเอียดเกี่ยวกับวิธีจัดการปัญหาเหล่านี้ได้ในส่วนปิดใช้ฟีเจอร์
กำหนดค่าไฟล์ Manifest ของแอป
หากต้องการกำหนดเป้าหมายเป็นอุปกรณ์ Android Automotive OS แอปของคุณต้องมีรายการบางรายการในไฟล์ Manifest หลังจากเลือกเข้าร่วมการเผยแพร่ไปยังอุปกรณ์ Android Automotive OS แล้ว Google Play จะตรวจสอบแอปที่เข้ากันได้เพื่อช่วยให้มั่นใจว่าแอปนั้นปลอดภัยสำหรับการใช้งานในรถยนต์ ดูรายละเอียดเพิ่มเติมได้ที่ เผยแพร่ไปยังรถยนต์
ฟีเจอร์ Android Automotive OS ที่จำเป็น
แอปทั้งหมดที่สร้างขึ้นสำหรับ Android Automotive OS ต้องเป็นไปตามข้อกำหนดบางอย่างจึงจะเผยแพร่โดยใช้ Google Play ได้ ดูข้อมูลเพิ่มเติมได้ที่ข้อกำหนดด้านฟีเจอร์ของ Google Play
รายการในไฟล์ Manifest เฉพาะหมวดหมู่
นอกเหนือจากข้อกำหนดข้างต้นซึ่งใช้กับแอปทั้งหมดสำหรับจอดรถแล้ว หมวดหมู่วิดีโอและเกมยังมีข้อกำหนดเพิ่มเติมดังนี้
- สำหรับแอปวิดีโอ โปรดดูหัวข้อ ทำเครื่องหมายแอปเป็นแอปวิดีโอ
- สำหรับเกม โปรดดูหัวข้อ ทำเครื่องหมายแอปเป็นเกม
ปฏิบัติตามข้อกำหนดด้านการรบกวนการขับขี่
การหลีกเลี่ยงการรบกวนการขับขี่เป็นสิ่งสำคัญเมื่อนำแอปไปใช้ในรถยนต์ สำหรับ
แอปสำหรับจอดรถ คุณสามารถทำได้โดยหลักๆ คือการป้องกันไม่ให้แอปถูกใช้งานหรือเล่นเสียงขณะที่ ข้อจำกัดด้านประสบการณ์ของผู้ใช้ (UX)
มีผลอยู่ ตามที่ระบุไว้ในหลักเกณฑ์ด้านคุณภาพ DD-2 และ
DD-3
ป้องกันการใช้งานขณะที่ข้อจำกัดด้านประสบการณ์ของผู้ใช้มีผลอยู่
โดยค่าเริ่มต้น กิจกรรมจะใช้หรือเปิดใช้ไม่ได้ขณะที่ข้อจำกัดด้าน UX มีผลอยู่ แอปต้องไม่มีองค์ประกอบ <meta-data> ต่อไปนี้ในองค์ประกอบ
<activity> ใดๆ ภายในไฟล์
Manifest เพื่อให้แน่ใจว่าลักษณะการทำงานนี้ใช้กับแอปของคุณ
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
หากกิจกรรมในแอปของคุณอยู่ในสถานะ Resumed เมื่อข้อจำกัดด้าน UX มีผล กิจกรรมนั้นจะถูกบดบังด้วยกิจกรรมที่เป็นของระบบปฏิบัติการ
อย่างน้อยที่สุด กิจกรรมของแอปจะเปลี่ยนไปอยู่ในสถานะวงจรการทำงาน
Paused ซึ่งจะเกิดขึ้นเป็นโค้ดเรียกกลับวงจรการทำงาน onPause ซึ่งคุณต้องหยุดการเล่นทั้งวิดีโอและเสียงจากแอป
ในอุปกรณ์ที่มีโหมดความเข้ากันได้ของ Android Automotive OS การบล็อกของระบบจะทำให้กิจกรรมของแอปเปลี่ยนไปอยู่ในสถานะ Paused แล้วจึงเปลี่ยนไปอยู่ในสถานะ Stopped
หยุดการเล่นและป้องกันไม่ให้เล่นต่อ
สำหรับบางแอป การหยุดการเล่นชั่วคราวระหว่าง onPause() และการติดตามสถานะเพื่อป้องกันไม่ให้เล่นต่อจนกว่าจะถึง onResume() ก็เพียงพอที่จะเป็นไปตามข้อกำหนดด้านการรบกวนการขับขี่
หากการตอบสนองต่อโค้ดเรียกกลับวงจรการทำงานไม่เพียงพอสำหรับแอป คุณสามารถฟังสถานะข้อจำกัดด้าน UX ได้โดยตรงตามที่อธิบายไว้ในส่วนต่อไปนี้ เช่น แอปที่รองรับภาพซ้อนภาพอาจต้องการฟัง โดยตรงมากกว่าที่จะมีการตรวจสอบแบบมีเงื่อนไขในโค้ดเรียกกลับวงจรการทำงาน
ฟังข้อจำกัดด้านประสบการณ์ของผู้ใช้
หากต้องการฟังข้อจำกัดด้าน UX ให้เพิ่มทรัพยากร Dependency ในไลบรารี
android.car ในไฟล์ build.gradle ของโมดูลแอปก่อน
ซึ่งเป็นส่วนขยายของ Android SDK ที่มี API ที่เฉพาะเจาะจงกับ Android Automotive OS
android {
...
useLibrary("android.car")
}
ใช้ CarUxRestrictionsManager เพื่ออ่านสถานะข้อจำกัดด้าน UX อย่าพยายามกำหนดสถานะข้อจำกัดด้าน UX จากสถานะฮาร์ดแวร์อื่นๆ เช่น เกียร์หรือความเร็ว เนื่องจากข้อจำกัดด้าน UX อาจแตกต่างกันไปในแต่ละจอแสดงผลภายในรถยนต์
val car = Car.createCar(context) ?: return val carUxRestrictionsManager = car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return // You can either read the state directly ... val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions // or listen to state changes carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions -> // Handle UX restrictions } // Don't forget to teardown and release resources when they're no longer needed carUxRestrictionsManager.unregisterListener() car.disconnect()
ค่าเดียวที่ CarUxRestrictions ระบุไว้ซึ่งแอปของคุณ
อ้างอิงถึงคือค่าที่แสดงผลของ isRequiresDistractionOptimization
ค่าอื่นๆ จะเกี่ยวข้องกับกิจกรรมที่ทำเครื่องหมายว่ามีการเพิ่มประสิทธิภาพเพื่อลดการรบกวนเท่านั้น
ทดสอบการใช้งาน
ตรวจสอบว่าแอปเป็นไปตามข้อกำหนดด้านการรบกวนการขับขี่โดยใช้ขั้นตอนต่อไปนี้
- ติดตั้งแอปในอิมเมจระบบที่ไม่มี Google Play Store หรือโหมดความเข้ากันได้
- เปิดตารางกริดสำหรับแอป Launcher แล้วจำลองการขับรถและตรวจสอบว่าไม่สามารถเปิดแอปได้
- หยุดจำลองการขับรถแล้วเปิดแอปไปที่หน้าจอการเล่นและเริ่มเล่น
- จำลองการขับรถอีกครั้งและตรวจสอบว่าการเล่นหยุดชั่วคราว
- หากแอปของคุณรองรับการผสานรวมกับ
MediaSessionให้ใช้adb shell cmd media_session dispatch playและตรวจสอบว่าการเล่นไม่กลับมาเล่นต่อ
- หากแอปของคุณรองรับการผสานรวมกับ
เพิ่มประสิทธิภาพแอปสำหรับ Android Automotive OS
หากต้องการมอบประสบการณ์ที่ดีที่สุดเท่าที่จะเป็นไปได้ให้แก่ผู้ใช้ในรถยนต์ โปรดคำนึงถึงสิ่งต่อไปนี้ขณะสร้างแอปสำหรับ Android Automotive OS
ทำงานร่วมกับระยะขอบหน้าต่างและการตัดออกของจอแสดงผล
Android Automotive OS มีองค์ประกอบ UI ของระบบ เช่น แถบสถานะและแถบนำทาง รวมถึงรองรับจอแสดงผลที่ไม่ใช่สี่เหลี่ยมผืนผ้า เช่นเดียวกับอุปกรณ์รูปแบบอื่นๆ
โดยค่าเริ่มต้น แอปจะวาดในพื้นที่ที่ไม่ทับซ้อนกับแถบระบบหรือการตัดออกของจอแสดงผล อย่างไรก็ตาม คุณอาจต้องการให้แอปซ่อนแถบระบบ วาดเนื้อหาไว้ด้านหลัง หรือแสดงเนื้อหาในหน้าจอรอยบากตามที่อธิบายไว้ ใน จัดวางแอปภายในระยะขอบหน้าต่าง หากแอปของคุณทำสิ่งเหล่านี้ โปรดดูรายละเอียดในส่วนย่อยต่อไปนี้เกี่ยวกับวิธีทำให้แอปทำงานได้ดีในระบบนิเวศของอุปกรณ์ Android Automotive OS
แถบระบบ โหมดเต็มหน้าจอ และการแสดงผลแบบขอบจรดขอบ
แถบระบบในรถยนต์อาจมีขนาดและตำแหน่งแตกต่างจากอุปกรณ์รูปแบบอื่นๆ เช่น แถบนำทางอาจอยู่ที่ด้านซ้าย ด้านขวา หรือด้านล่างของหน้าจอ แม้ว่าจะมีแถบสถานะอยู่ด้านบนและแถบนำทางอยู่ด้านล่าง (เช่นเดียวกับโทรศัพท์และแท็บเล็ตส่วนใหญ่) ขนาดขององค์ประกอบเหล่านี้ก็มีแนวโน้มที่จะใหญ่กว่ามากในรถยนต์
นอกจากนี้ Android Automotive OS ยังอนุญาตให้ OEM ควบคุมได้ว่า
แอปจะแสดงหรือซ่อนแถบระบบเพื่อเข้าสู่และออกจากโหมดเต็มหน้าจอ
ได้หรือไม่ ตัวอย่างเช่น การป้องกันไม่ให้แอปซ่อนแถบระบบจะช่วยให้ OEM มั่นใจได้ว่าการควบคุมยานพาหนะ เช่น การควบคุมสภาพอากาศ จะเข้าถึงได้บนหน้าจอเสมอ หาก OEM ป้องกันไม่ให้แอปควบคุมแถบระบบ จะไม่มีสิ่งใดเกิดขึ้นเมื่อแอปเรียกใช้
WindowInsetsController (หรือ WindowInsetsControllerCompat)
API เพื่อแสดงหรือซ่อนแถบระบบ โปรดดูเอกสารประกอบของ show และ hide เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีตรวจหาว่าแอปของคุณแก้ไขระยะขอบได้หรือไม่
ในทำนองเดียวกัน OEM ยังควบคุมได้ว่าแอปจะตั้งค่าสีและความโปร่งแสงของแถบระบบได้หรือไม่ เพื่อให้แถบและองค์ประกอบที่อยู่ในแถบนั้นมองเห็นได้อย่างชัดเจนตลอดเวลา หากแอปแสดงผลแบบขอบจรดขอบ ให้ตรวจสอบว่ามีการแสดงผลเฉพาะเนื้อหาที่ไม่สำคัญไว้ด้านหลังแถบระบบ เนื้อหานี้อาจมองไม่เห็นหาก OEM ของอุปกรณ์ป้องกันไม่ให้ตั้งค่าสีหรือความโปร่งแสงของแถบ
<!-- Depending on OEM configuration, these style declarations
(and the corresponding runtime calls) may be ignored -->
<style name="...">
<item name="android:statusBarColor">...</item>
<item name="android:navigationBarColor">...</item>
<item name="android:windowTranslucentStatus">...</item>
<item name="android:windowTranslucentNavigation">...</status>
</style>
หากแอปแสดงผลแบบขอบจรดขอบ อย่าคาดการณ์เกี่ยวกับขนาด จำนวน ประเภท หรือตำแหน่งของแถบระบบ แต่ให้ใช้ Window Insets API เพื่อจัดวางเนื้อหาของแอปเทียบกับแถบระบบ ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ API เหล่านี้ได้ที่หัวข้อ แสดงเนื้อหาแบบขอบจรดขอบในแอป เราไม่แนะนำให้ใช้ค่าระยะห่างภายในที่ฮาร์ดโค้ดสำหรับอุปกรณ์รูปแบบใดๆ แต่ในรถยนต์ ค่าเหล่านั้นอาจใช้ไม่ได้เลยในการเก็บเนื้อหาไว้ในพื้นที่ปลอดภัย
ปรับให้เข้ากับจอแสดงผลที่มีรูปร่างไม่ปกติ
นอกเหนือจากจอแสดงผลสี่เหลี่ยมผืนผ้าแล้ว รถยนต์บางคันอาจมีหน้าจอที่มีรูปร่างไม่ปกติ เช่น ที่แสดงใน รูปที่ 1:
หากแอปไม่แสดงผลแบบขอบจรดขอบ คุณไม่จำเป็นต้องดำเนินการใดๆ เพื่อให้แอปแสดงผลภายในพื้นที่ปลอดภัย
หากแอปแสดงผลแบบขอบจรดขอบ คุณสามารถเลือกวิธีที่ต้องการให้แอปทำงานเกี่ยวกับการตัดออกของจอแสดงผล คุณทำได้โดยใช้ทรัพยากร
ด้วยการตั้งค่า
android:windowLayoutInDisplayCutoutMode
แอตทริบิวต์สำหรับธีมของแอป หรือตั้งค่าในรันไทม์
โดยการแก้ไข
layoutInDisplayCutoutMode
แอตทริบิวต์ของหน้าต่าง
เนื่องจากการตัดออกของจอแสดงผลประเภทต่างๆ ที่มีในอุปกรณ์ Android Automotive OS
แตกต่างจากการตัดออกของจอแสดงผลในอุปกรณ์เคลื่อนที่ จึงไม่ควรใช้
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
หรือ LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,
ซึ่งมีลักษณะการทำงานที่ปรับให้เหมาะกับการตัดออกของจอแสดงผลที่พบในอุปกรณ์เคลื่อนที่ แต่ให้ใช้ LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
หรือ LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
เพื่อหลีกเลี่ยงหรือเข้าสู่การตัดออกของจอแสดงผลเสมอ เมื่อเลือกตัวเลือกหลัง
โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับ API ที่เกี่ยวข้องกับการตัดออกของจอแสดงผลได้ที่หัวข้อรองรับการตัดออกของจอแสดงผล
หากแอปแสดงผลในพื้นที่หน้าจอรอยบากและคุณต้องการให้แอปมีลักษณะการทำงานที่แตกต่างกันระหว่าง Android Automotive OS กับอุปกรณ์เคลื่อนที่ โปรดดูคำแนะนำในหัวข้อปิดใช้ฟีเจอร์หากแอปตั้งค่าลักษณะการทำงานนี้ในรันไทม์ และใช้ทรัพยากรอื่นหากแอปตั้งค่าลักษณะการทำงานนี้โดยใช้ไฟล์ทรัพยากร
ปิดใช้ฟีเจอร์
หากคุณกำลังนำแอปที่มีอยู่สำหรับอุปกรณ์เคลื่อนที่มาใช้ใน Android Automotive OS ฟีเจอร์และฟังก์ชันการทำงานบางอย่างอาจไม่เกี่ยวข้องหรือใช้ไม่ได้ เช่น โดยทั่วไปแล้วรถยนต์จะไม่อนุญาตให้เข้าถึงกล้อง นอกจากนี้ บริการ Google Play บางส่วนเท่านั้นที่ใช้ได้ใน Android Automotive OS โปรดดูรายละเอียดเพิ่มเติมได้ที่บริการ Google Play สำหรับรถยนต์
คุณสามารถใช้ PackageManager.hasSystemFeature
API เพื่อตรวจหาว่าแอปกำลังทำงานใน Android Automotive OS หรือไม่ โดยตรวจสอบ
ฟีเจอร์
FEATURE_AUTOMOTIVE
ดังที่แสดงในตัวอย่างต่อไปนี้
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE) if (isCar) { // Enable or disable a given feature }
หรือหากแอปของคุณมีคอมโพเนนต์ Android Auto ด้วย คุณสามารถ
ใช้ CarConnection API จาก
ไลบรารีแอป Android สำหรับรถยนต์ เพื่อตรวจหาว่าแอปกำลัง
ทำงานใน Android Automotive OS หรือ Android Auto หรือไม่ได้
เชื่อมต่อกับรถยนต์เลย
สำหรับภาพซ้อนภาพ (PiP) ให้ทำตามแนวทางปฏิบัติแนะนำที่กำหนดไว้ ที่ดีที่สุดเพื่อตรวจสอบว่า ฟีเจอร์พร้อมใช้งานหรือไม่ และตอบสนองอย่างเหมาะสม
จัดการสถานการณ์ออฟไลน์
แม้ว่ารถยนต์จะเชื่อมต่ออินเทอร์เน็ตได้มากขึ้นเรื่อยๆ แต่เราขอแนะนำให้แอปจัดการการทำงานโดยไม่มีการเชื่อมต่ออินเทอร์เน็ต เช่น ในกรณีต่อไปนี้
- ผู้ใช้อาจเลือกไม่ใช้ข้อมูลมือถือที่ผู้ผลิตรถยนต์เสนอให้เป็นส่วนหนึ่งของแพ็กเกจการสมัครใช้บริการ
- การเข้าถึงข้อมูลมือถืออาจถูกจำกัดในบางพื้นที่
- รถยนต์ที่มีวิทยุ Wi-Fi อาจอยู่นอกระยะ Wi-Fi หรือ OEM อาจ ปิด Wi-Fi เพื่อใช้เครือข่ายมือถือแทน
เตรียมพร้อมที่จะจัดการสถานการณ์เหล่านี้ในแอปโดยลดฟังก์ชันการทำงานที่ขึ้นอยู่กับการเข้าถึงอินเทอร์เน็ตลงอย่างเหมาะสม เช่น การเสนอเนื้อหาออฟไลน์ ดูข้อมูลเพิ่มเติมได้ที่แนวทางปฏิบัติแนะนำสำหรับการเพิ่มประสิทธิภาพ เครือข่าย
ใช้ทรัพยากรอื่น
คุณสามารถใช้ตัวระบุทรัพยากร car เพื่อให้ทรัพยากรอื่นเมื่อทำงานในรถยนต์ Android Automotive OS เพื่อช่วยปรับแอปให้เหมาะกับรถยนต์ ตัวอย่างเช่น หากคุณใช้
ทรัพยากร Dimension เพื่อจัดเก็บ
ค่าระยะห่างภายใน คุณสามารถใช้ค่าที่ใหญ่ขึ้นสำหรับชุดทรัพยากร car เพื่อทำให้
เป้าหมายการสัมผัสมีขนาดใหญ่ขึ้น