เพิ่มการรองรับ 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"/>

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

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

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

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

คุณสามารถใช้ 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 เพื่อทำให้ เป้าหมายการสัมผัสมีขนาดใหญ่ขึ้น