เพิ่มการรองรับ Android Automotive OS ลงในแอปที่หยุดทำงาน

เมื่อจัดจำหน่ายแอปไปยังอุปกรณ์ 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"/>

หากกิจกรรมในแอปของคุณกลับมาทำงานอีกครั้งเมื่อข้อจำกัด 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 ค่าอื่นๆ จะเกี่ยวข้องกับกิจกรรมที่ทำเครื่องหมายว่าเพิ่มประสิทธิภาพเพื่อลดการเสียสมาธิเท่านั้น

ทดสอบการใช้งาน

ตรวจสอบว่าแอปเป็นไปตามข้อกำหนดเกี่ยวกับการเสียสมาธิของผู้ขับโดยใช้ขั้นตอนต่อไปนี้

  1. ติดตั้งแอปในอิมเมจระบบที่ไม่มี Google Play Store หรือโหมดความเข้ากันได้
  2. เมื่อตารางกริดสำหรับแอปของ Launcher เปิดอยู่ ให้จำลองการขับรถและยืนยันว่าแอปของคุณเปิดไม่ได้
  3. หยุดจำลองการขับรถและเปิดแอปไปยังหน้าจอการเล่น แล้วเริ่มเล่น
  4. จำลองการขับรถอีกครั้งและยืนยันว่าการเล่นหยุดชั่วคราว
    1. หากแอปของคุณรองรับการผสานรวมกับ 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 Automotive OS ที่มีจอแสดงผลโค้งทางด้านขวา
รูปที่ 1: อุปกรณ์ Android Automotive OS ที่มีจอแสดงผลโค้งทางด้านขวา พื้นที่สีเขียวคือสี่เหลี่ยมผืนผ้าที่ปลอดภัยซึ่งไม่ทับซ้อนกับกรอบล้อมรอบของหน้าจอรอยบากของเส้นโค้ง

หากแอปไม่ได้แสดงผลแบบไร้ขอบ คุณไม่จำเป็นต้องดำเนินการใดๆ เพื่อให้แอปแสดงผลภายในพื้นที่ปลอดภัย

หากแอปแสดงผลแบบไร้ขอบ คุณสามารถเลือกวิธีที่ต้องการให้แอปทำงานเมื่อมีหน้าจอรอยบาก คุณทำเช่นนี้ได้โดยใช้ทรัพยากรด้วยการตั้งค่าแอตทริบิวต์ 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 เพื่อทำให้เป้าหมายการสัมผัสมีขนาดใหญ่ขึ้น