เมื่อจัดจำหน่ายแอปไปยังอุปกรณ์ 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 ดูรายละเอียดเกี่ยวกับวิธีจัดการปัญหาเหล่านี้ได้ที่ส่วนปิดใช้ฟีเจอร์
ทักษะ Android
ดูใน GitHubแอปสำหรับใช้งานตอนจอดรถของ Android สำหรับรถยนต์
android skills add android-for-cars-parked-appsกำหนดค่าไฟล์ 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"/>
หากกิจกรรมในแอปของคุณกลับมาทำงานอีกครั้งเมื่อข้อจำกัด UX ทำงาน กิจกรรมดังกล่าวจะถูกบดบังด้วยกิจกรรมที่ระบบปฏิบัติการเป็นเจ้าของ
อย่างน้อยที่สุด กิจกรรมของแอปจะเปลี่ยนไปเป็นสถานะวงจรหยุดชั่วคราว ซึ่งจะเกิดขึ้นเป็น Lifecycle Callback ของ onPause ซึ่งคุณต้องหยุดการเล่นทั้งวิดีโอและเสียงจากแอปชั่วคราว
ในอุปกรณ์ที่มีโหมด ความเข้ากันได้ของ Android Automotive OS การบล็อกของระบบจะทำให้กิจกรรมของแอปเปลี่ยนผ่านสถานะ หยุดชั่วคราวไปยังสถานะหยุดทำงาน
หยุดเล่นและป้องกันไม่ให้กลับมาเล่นต่อ
สำหรับบางแอป การหยุดเล่นชั่วคราวระหว่าง onPause() และการติดตามสถานะเพื่อป้องกันไม่ให้เล่นต่อจนกว่า onResume() จะเพียงพอต่อการปฏิบัติตามข้อกำหนดด้านการเสียสมาธิของผู้ขับ
หากการตอบสนองต่อ Lifecycle Callback ไม่เพียงพอสำหรับแอป คุณสามารถฟังสถานะข้อจำกัด UX ได้โดยตรงตามที่อธิบายไว้ในส่วนต่อไปนี้ เช่น แอปที่รองรับการแสดงภาพซ้อนภาพอาจต้องการฟังโดยตรงมากกว่าการตรวจสอบแบบมีเงื่อนไขใน Lifecycle Callback
ฟังข้อจำกัดด้านประสบการณ์ของผู้ใช้
หากต้องการฟังข้อจำกัด 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 ป้องกันไม่ให้แอปควบคุมแถบระบบ จะไม่มีอะไรเกิดขึ้นเมื่อแอปเรียกใช้ API WindowInsetsController (หรือ WindowInsetsControllerCompat) เพื่อแสดงหรือซ่อนแถบระบบ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีตรวจหาว่าแอปสามารถแก้ไขส่วนแทรกได้หรือไม่ในเอกสารประกอบของ 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>
หากแอปแสดงผลแบบไร้ขอบ อย่าคาดเดาขนาด จำนวน ประเภท หรือตำแหน่งของแถบระบบ แต่ให้ใช้ 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 สำหรับรถยนต์
คุณสามารถใช้ API PackageManager.hasSystemFeature เพื่อตรวจหาว่าแอปทำงานใน Android Automotive OS หรือไม่โดยตรวจหาฟีเจอร์ FEATURE_AUTOMOTIVE ดังที่แสดงในตัวอย่างต่อไปนี้
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE) if (isCar) { // Enable or disable a given feature }
หรือหากแอปมีคอมโพเนนต์ Android Auto ด้วย คุณสามารถใช้ API CarConnection จากไลบรารีแอป Android สำหรับรถยนต์เพื่อตรวจหาว่าแอปทำงานบน Android Automotive OS หรือ Android Auto หรือไม่ได้เชื่อมต่อกับรถยนต์เลย
สำหรับการแสดงภาพซ้อนภาพ (PiP) ให้ทำตามแนวทางปฏิบัติแนะนำที่กำหนดไว้เพื่อตรวจสอบว่าฟีเจอร์นี้พร้อมใช้งานหรือไม่ และตอบสนองอย่างเหมาะสม
จัดการสถานการณ์ออฟไลน์
แม้ว่ารถยนต์จะเชื่อมต่ออินเทอร์เน็ตมากขึ้นเรื่อยๆ แต่เราขอแนะนำให้แอปจัดการการทำงานโดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต เช่น ในกรณีต่อไปนี้
- ผู้ใช้อาจเลือกไม่ใช้อินเทอร์เน็ตมือถือที่เสนอเป็นส่วนหนึ่งของแพ็กเกจการสมัครใช้บริการจากผู้ผลิตรถยนต์
- การเข้าถึงอินเทอร์เน็ตมือถืออาจถูกจำกัดในบางพื้นที่
- รถยนต์ที่มีวิทยุ Wi-Fi อาจอยู่นอกระยะสัญญาณ Wi-Fi หรือ OEM อาจปิด Wi-Fi เพื่อใช้เครือข่ายมือถือ
เตรียมพร้อมรับมือกับสถานการณ์เหล่านี้ในแอปด้วยการลดระดับฟังก์ชันการทำงานที่ขึ้นอยู่กับการเข้าถึงอินเทอร์เน็ตอย่างค่อยเป็นค่อยไป เช่น การนำเสนอเนื้อหาแบบออฟไลน์ ดูข้อมูลเพิ่มเติมได้ในแนวทางปฏิบัติแนะนำสำหรับการเพิ่มประสิทธิภาพเครือข่าย
ใช้แหล่งข้อมูลอื่น
หากต้องการปรับแอปให้เหมาะกับรถยนต์ คุณสามารถใช้ตัวระบุทรัพยากร car เพื่อจัดหาทรัพยากรสำรองเมื่อทำงานในรถยนต์ที่ใช้ Android Automotive OS ตัวอย่างเช่น หากคุณใช้ทรัพยากรมิติข้อมูลเพื่อจัดเก็บค่าระยะห่างจากขอบ คุณสามารถใช้ค่าที่มากกว่าสำหรับชุดทรัพยากร car เพื่อทำให้เป้าหมายการสัมผัสมีขนาดใหญ่ขึ้น