แอปการนำทาง จุดที่น่าสนใจ (POI) และสภาพอากาศที่ใช้เทมเพลตต่อไปนี้
จะวาดแผนที่ได้โดยการเข้าถึง Surface
หากต้องการใช้เทมเพลตต่อไปนี้ แอปของคุณต้องประกาศสิทธิ์ที่เกี่ยวข้องอย่างใดอย่างหนึ่งในองค์ประกอบ <uses-permission> ในไฟล์ AndroidManifest.xml
| เทมเพลต | สิทธิ์ | คำแนะนำ |
|---|---|---|
NavigationTemplate |
androidx.car.app.NAVIGATION_TEMPLATES |
การนำทาง |
MapWithContentTemplate |
หรือ
|
การนำทาง POI สภาพอากาศ |
|
(เลิกใช้งานแล้ว) |
androidx.car.app.NAVIGATION_TEMPLATES |
การนำทาง |
|
(เลิกใช้งานแล้ว) |
androidx.car.app.NAVIGATION_TEMPLATES |
การนำทาง |
(เลิกใช้งานแล้ว) |
androidx.car.app.NAVIGATION_TEMPLATES |
การนำทาง |
ดูการติดตั้งใช้งานอ้างอิง
ดูการติดตั้งใช้งานอ้างอิงที่สมบูรณ์ได้ที่ตัวอย่างการนำทาง
ประกาศสิทธิ์พื้นผิว
นอกเหนือจากสิทธิ์ที่จำเป็นสำหรับเทมเพลตที่แอปของคุณใช้แล้ว
แอปของคุณต้องประกาศสิทธิ์ androidx.car.app.ACCESS_SURFACE ในไฟล์
AndroidManifest.xml เพื่อรับสิทธิ์เข้าถึงพื้นผิว
<manifest ...>
...
<uses-permission android:name="androidx.car.app.ACCESS_SURFACE" />
...
</manifest>
เข้าถึงแพลตฟอร์ม
หากต้องการเข้าถึง Surface ที่โฮสต์ระบุ คุณต้องใช้ SurfaceCallback และให้การติดตั้งใช้งานดังกล่าวแก่บริการรถยนต์ของ AppManager
ระบบจะส่ง Surface ปัจจุบันไปยัง SurfaceCallback ในพารามิเตอร์ SurfaceContainer ของ onSurfaceAvailable() และ Callback onSurfaceDestroyed()
Kotlin
carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)
Java
carContext.getCarService(AppManager.class).setSurfaceCallback(surfaceCallback);
ใช้จอแสดงผลเสมือนเพื่อแสดงเนื้อหา
นอกเหนือจากการแสดงผลโดยตรงใน Surface โดยใช้ API ของ Canvas แล้ว
คุณยังแสดงผล View ใน Surface โดยใช้ API ของ VirtualDisplay และ
Presentation ได้ด้วย ดังตัวอย่างนี้
class HelloWorldSurfaceCallback(context: Context) : SurfaceCallback {
lateinit var virtualDisplay: VirtualDisplay
lateinit var presentation: Presentation
override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
virtualDisplay = context
.getSystemService(DisplayManager::class.java)
.createVirtualDisplay(
VIRTUAL_DISPLAY_NAME ,
surfaceContainer.width,
surfaceContainer.height,
surfaceContainer.dpi,
surfaceContainer.surface,
0
)
presentation = Presentation(context, virtualDisplay.display)
// Instantiate the view to be used as the content view
val view = ...
presentation.setContentView(view)
presentation.show()
}
override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) {
presentation.dismiss()
// This handles releasing the Surface provided when creating the VirtualDisplay
virtualDisplay.release()
}
}
ใช้ Compose เพื่อแสดงผลไปยังจอแสดงผลเสมือน
คุณสามารถใช้ ComposeView เป็นมุมมองเนื้อหาของ Presentation เนื่องจากมีการใช้
ComposeViewนอกกิจกรรม ให้ยืนยันว่ากิจกรรมหรือมุมมองระดับบนสุด
ส่งต่อ LifecycleOwner และ SavedStateRegistryOwner โดยใช้ setViewTreeLifecycleOwner และ setViewTreeSavedStateRegistryOwner
Session ใช้ LifecycleOwner อยู่แล้ว หากต้องการทำหน้าที่ทั้ง 2 บทบาท การติดตั้งใช้งานของคุณจะสามารถใช้ SavedStateRegistryOwner เพิ่มเติมได้
class HelloWorldSession() : Session(), SavedStateRegistryOwner { ... }
class HelloWorldSurfaceCallback(session: HelloWorldSession) : SurfaceCallback {
...
override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
...
val view = ComposeView(session.carContext)
view.setViewTreeLifecycleOwner(session)
view.setViewTreeSavedStateRegistryOwner(session)
view.setContent {
// Composable content
}
presentation.setContentView(view)
presentation.show()
}
...
}
ทำความเข้าใจพื้นที่ที่มองเห็นได้บนพื้นผิว
โฮสต์สามารถวาดองค์ประกอบของอินเทอร์เฟซผู้ใช้สำหรับเทมเพลตบนแผนที่ได้
โฮสต์เรียกใช้เมธอด SurfaceCallback.onVisibleAreaChanged
เพื่อสื่อสารพื้นที่ของพื้นผิวที่น่าจะไม่มีสิ่งกีดขวางและ
มองเห็นได้สำหรับผู้ใช้
โฮสต์จะเรียกใช้เมธอด
SurfaceCallback.onStableAreaChanged ที่มีสี่เหลี่ยมผืนผ้าที่เล็กที่สุด
ซึ่งจะมองเห็นได้เสมอตามเทมเพลตปัจจุบัน เพื่อลดจำนวนการเปลี่ยนแปลง
ตัวอย่างเช่น เมื่อแอปนำทางใช้ NavigationTemplate ที่มี
แถบการดำเนินการที่ด้านบน เพื่อให้มีพื้นที่มากขึ้นบนหน้าจอ แถบการดำเนินการจะ
ซ่อนได้เมื่อผู้ใช้ไม่ได้โต้ตอบกับหน้าจอ ในกรณีนี้ ระบบจะเรียกกลับไปยัง onStableAreaChanged และ onVisibleAreaChanged โดยใช้สี่เหลี่ยมผืนผ้าเดียวกัน
เมื่อแถบการดำเนินการซ่อนอยู่ ระบบจะเรียกใช้เฉพาะ onVisibleAreaChanged โดยมีพื้นที่ขนาดใหญ่กว่า หากผู้ใช้โต้ตอบกับหน้าจอ ระบบจะเรียกใช้เฉพาะ
onVisibleAreaChanged กับสี่เหลี่ยมผืนผ้าแรก
รองรับธีมมืด
แอปต้องวาดแผนที่ใหม่ลงในอินสแตนซ์ Surface โดยใช้สีเข้มที่เหมาะสมเมื่อโฮสต์พิจารณาว่ามีเงื่อนไขที่รับประกันได้ ตามที่อธิบายไว้ในคุณภาพแอป Android สำหรับรถยนต์
หากต้องการวาดแผนที่สีเข้ม ให้ใช้วิธี CarContext.isDarkMode เมื่อสถานะของดาร์ก
โหมดมีการเปลี่ยนแปลง คุณจะได้รับสายไปยัง
Session.onCarConfigurationChanged
วาดแผนที่บนจอแสดงผลคลัสเตอร์
นอกจากจะวาดแผนที่บนจอแสดงผลหลักแล้ว แอปการนำทางยังรองรับการวาดแผนที่บนจอแสดงผลแผงหน้าปัดด้านหลังพวงมาลัยด้วย ดูข้อมูลเพิ่มเติมได้ที่การวาดภาพไปยังจอแสดงผลคลัสเตอร์