แผงหน้าปัด Instrument

ใช้ Instrument Cluster API (Android API) เพื่อแสดงแอปการนำทาง รวมถึง Google Maps บนจอแสดงผลรองในรถยนต์ เช่น หลังพวงมาลัยบนแผงหน้าปัด หน้านี้อธิบายวิธีการสร้างบริการที่จะควบคุมว่าจอแสดงผลรองและแล้วบูรณาการให้บริการกับ CarService เพื่อให้แอปนำทางสามารถแสดงส่วนติดต่อผู้ใช้

คำศัพท์

คำต่อไปนี้ใช้ในหน้านี้:

ภาคเรียน คำอธิบาย
CarInstrumentClusterManager CarManager ที่ช่วยให้แอปภายนอกที่จะเปิดตัวกิจกรรมบนแผงหน้าปัดและได้รับการเรียกกลับเมื่อแผงหน้าปัดพร้อมที่จะแสดงกิจกรรม
ผู้จัดการรถ ชั้นฐานของผู้จัดการทุกคนที่ใช้โดยแอพพลิเคภายนอกเพื่อโต้ตอบกับบริการรถเฉพาะที่ดำเนินการโดย CarService
CarService บริการแพลตฟอร์ม Android ที่ให้การสื่อสารระหว่างแอปภายนอก (รวมถึง Google Maps) และคุณลักษณะเฉพาะของรถยนต์ เช่น การเข้าถึงแผงหน้าปัด
ปลายทาง ปลายทางสุดท้ายที่ยานพาหนะจะนำทาง
กทพ เวลาที่คาดว่าจะมาถึงปลายทาง
หัวหน้าหน่วย (HU) หน่วยคำนวณหลักที่ฝังอยู่ในรถยนต์ HU ใช้รหัส Android ทั้งหมดและเชื่อมต่อกับจอแสดงผลส่วนกลางในรถ
แผงหน้าปัด จอแสดงผลรองที่อยู่หลังพวงมาลัยและระหว่างแผงหน้าปัดรถยนต์ ซึ่งอาจเป็นหน่วยคำนวณอิสระที่เชื่อมต่อกับ HU ผ่านเครือข่ายภายในของรถ (CAN บัส) หรือจอแสดงผลรองที่ต่อกับ HU
InstrumentClusterRenderingService คลาสพื้นฐานสำหรับบริการที่ใช้ในการเชื่อมต่อกับจอแสดงผล Instrument Cluster OEM ต้องมีส่วนขยายของคลาสนี้ที่โต้ตอบกับฮาร์ดแวร์เฉพาะของ OEM
แอพ KitchenSink แอปพลิเคชันทดสอบที่มาพร้อมกับ Android Automotive
เส้นทาง เส้นทางเฉพาะที่ยานพาหนะไปถึงปลายทาง
บริการซิงเกิลตัน บริการ Android กับ android:singleUser แอตทริบิวต์ ในช่วงเวลาใดก็ตาม อินสแตนซ์ของบริการส่วนใหญ่ทำงานบนระบบ Android อย่างน้อยหนึ่งอินสแตนซ์

ข้อกำหนดเบื้องต้น

ในการพัฒนาการบูรณาการ ต้องแน่ใจว่ามีองค์ประกอบเหล่านี้:

  • สภาพแวดล้อมการพัฒนา Android การตั้งค่าสภาพแวดล้อมการพัฒนา Android ดู ความต้องการของรูปร่าง
  • ดาวน์โหลดซอร์สโค้ด Android ได้รับรุ่นล่าสุดของรหัสที่มา Android จากสาขาปี่รถปล่อย (หรือหลังจากนั้น) ที่ https://android.googlesource.com
  • หัวหน้าหน่วย (HU) อุปกรณ์ Android ที่สามารถใช้ Android 9 (หรือใหม่กว่า) อุปกรณ์นี้ต้องมีจอแสดงผลของตัวเองและสามารถแสดงหน้าจอด้วย Android รุ่นใหม่ได้
  • แผงหน้าปัดเป็นหนึ่งต่อไปนี้:
    • จอแสดงผลรองทางกายภาพที่แนบมากับ HU หากฮาร์ดแวร์ของอุปกรณ์และเคอร์เนลรองรับการจัดการจอแสดงผลหลายจอ
    • หน่วยอิสระ หน่วยคำนวณใดๆ ที่เชื่อมต่อกับ HU ผ่านการเชื่อมต่อเครือข่าย สามารถรับและแสดงสตรีมวิดีโอบนจอแสดงผลของตนเองได้
    • จอแสดงผลจำลอง ในระหว่างการพัฒนา คุณสามารถใช้หนึ่งในสภาพแวดล้อมจำลองเหล่านี้:
      • จอแสดงผลรองจำลอง หากต้องการเปิดใช้งานจอแสดงผลรองจำลองบนการแจกจ่าย AOSP Android ใด ๆ ให้ไปที่การตั้งค่าตัวเลือกสำหรับนักพัฒนาในแอปพลิเคชันระบบการตั้งค่า จากนั้นเลือกจำลองจอแสดงผลรอง การกำหนดค่านี้เทียบเท่ากับการติดจอแสดงผลรองจริง โดยมีข้อจำกัดว่าจอแสดงผลนี้ถูกซ้อนทับบนจอแสดงผลหลัก
      • แผงหน้าปัดจำลอง จำลอง Android มาพร้อมกับ Android ยานยนต์มีตัวเลือกเพื่อแสดงแผงหน้าปัดกับ Android จำลอง _qemu ท่อ ใช้ DirectRenderingCluster การดำเนินงานแผงหน้าปัดอ้างอิงการเชื่อมต่อกับจอแสดงผลภายนอกนี้เทิดทูน

สถาปัตยกรรมบูรณาการ

ส่วนประกอบการบูรณาการ

การรวมใดๆ ของ Instrument Cluster API ประกอบด้วยสามองค์ประกอบเหล่านี้:

  • CarService
  • แอพนำทาง
  • บริการคลัสเตอร์อุปกรณ์ OEM

ส่วนประกอบการบูรณาการ

บริการรถยนต์

CarService ไกล่เกลี่ยระหว่างแอพนำทางและรถเพื่อให้มั่นใจว่ามีเพียงหนึ่ง app นำทางมีการใช้งานในเวลาใดก็ตามและมีเพียงปพลิเคชันที่มี android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL ได้รับอนุญาตสามารถส่งข้อมูลไปที่รถ

CarService วัฏจักรบริการรถเฉพาะและให้การเข้าถึงบริการเหล่านี้ผ่านชุดของผู้จัดการ เพื่อโต้ตอบกับบริการ แอปพลิเคชันที่ทำงานอยู่ในรถสามารถเข้าถึงผู้จัดการเหล่านี้ได้

สำหรับการดำเนินงานแผงหน้าปัด, OEMs ยานยนต์ต้องสร้างการดำเนินงานที่กำหนดเองของ InstrumentClusterRendererService และปรับปรุง config.xml ไฟล์ไปยังจุดที่จะดำเนินงานที่กำหนดเองที่

เมื่อแสดงเครื่องดนตรีคลัสเตอร์ในระหว่างขั้นตอนการบูต CarService อ่าน InstrumentClusterRendererService สำคัญของ config.xml เพื่อหาการดำเนินการของ InstrumentClusterService ใน AOSP รายการนี้ชี้ไปที่บริการแสดงตัวอย่างคลัสเตอร์การนำสถานะ API ไปใช้งาน:

<string name="instrumentClusterRendererService">
android.car.cluster/.ClusterRenderingService
</string>

บริการที่อ้างถึงในรายการนี้จะเริ่มต้นและผูกไว้กับ CarService เมื่อปพลิเคชันนำทางเช่น Google Maps, ขอ CarInstrumentClusterManager , CarService ให้ผู้จัดการที่อัปเดตสถานะแผงหน้าปัดจากผูกพัน InstrumentClusterRenderingService (ในกรณีนี้หมายถึงการที่ถูกผูกไว้ บริการ Android .)

บริการคลัสเตอร์เครื่องมือ

OEMs ต้องสร้างแพคเกจ Android (เอพีเค) ที่มี subclass ของ InstrumentClusterRendererService . ดู ClusterRenderingService สำหรับตัวอย่าง

คลาสนี้มีวัตถุประสงค์สองประการ:

  • จัดเตรียมอินเทอร์เฟซ Android และอุปกรณ์แสดงผลแบบคลัสเตอร์ (วัตถุประสงค์ของหน้านี้)
  • รับและแสดงการอัปเดตสถานะการนำทาง เช่น คำแนะนำการนำทางแบบเลี้ยวต่อเลี้ยว

เพื่อวัตถุประสงค์แรกการใช้งาน OEM ของ InstrumentClusterRendererService ต้องเริ่มต้นแสดงผลรองใช้ในการแสดงข้อมูลบนหน้าจอในห้องโดยสารรถและอุปกรณ์สื่อสารข้อมูลนี้ไปยัง CarService โดยโทรไป InstrumentClusterRendererService.setClusterActivityOptions() และ InstrumentClusterRendererService.setClusterActivityState() วิธีการ

สำหรับฟังก์ชั่นที่สองบริการแผงหน้าปัดจะต้องให้การดำเนินการของ NavigationRenderer อินเตอร์เฟซที่ได้รับสถานะนำทางเหตุการณ์การปรับปรุงซึ่งจะถูกเข้ารหัสเป็น eventType และเหตุการณ์การเข้ารหัสข้อมูลในกำ

ลำดับการรวม

ไดอะแกรมต่อไปนี้แสดงการใช้งานสถานะการนำทางที่แสดงการอัปเดต:

ลำดับการรวม

ในภาพประกอบนี้ สีแสดงถึงสิ่งต่อไปนี้:

  • สีเหลือง. CarService และ CarNavigationStatusManager ให้โดยแพลตฟอร์ม Android
  • สีฟ้า. InstrumentClusterRendererService ดำเนินการโดย OEM
  • สีม่วง. แอปการนำทางที่ดำเนินการโดย Google และนักพัฒนาบุคคลที่สาม
  • เขียว. CarAppFocusManager

โฟลว์ข้อมูลสถานะการนำทางตามลำดับนี้:

  1. CarService ทำการเริ่มต้น InstrumentClusterRenderingService
  2. ในระหว่างการเตรียมการ InstrumentClusterRenderingService ปรับปรุง CarService ด้วย:
    1. คุณสมบัติการแสดงคลัสเตอร์เครื่องมือ เช่น ขอบเขตที่ไม่คลุมเครือ (ดูรายละเอียดเพิ่มเติมเกี่ยวกับขอบเขตที่ไม่คลุมเครือในภายหลัง)
    2. ตัวเลือกกิจกรรมที่จำเป็นในการเปิดตัวกิจกรรมภายในจอแสดงผลที่แผงหน้าปัด (ดูรายละเอียดเพิ่มเติมได้ที่ ActivityOptions
  3. แอปการนำทาง (เช่น Google Maps สำหรับ Android Automotive หรือแอปแผนที่ใดๆ ที่มีสิทธิ์ที่จำเป็น):
    1. Obtains CarAppFocusManager ใช้คลาสรถจากรถ lib
    2. ก่อนที่จะหันทิศทางโดยหันเริ่มต้นการโทรไปยัง CarAppFocusManager.requestFocus() จะผ่าน CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION เป็น appType พารามิเตอร์
  4. CarAppFocusManager สื่อสารคำขอนี้เพื่อ CarService ถ้าได้รับ CarService ตรวจสอบแพคเกจแอปนำทางและตั้งอยู่ในกิจกรรมที่มีเครื่องหมายหมวด android.car.cluster.NAVIGATION
  5. หากพบว่ามีแอปพลิเคลูกศรใช้ ActivityOptions รายงานโดย InstrumentClusterRenderingService ที่จะเปิดตัวกิจกรรมและรวมถึงแผงหน้าปัดคุณสมบัติการแสดงผลเป็นของแถมในเจตนา

การรวม API

InstrumentClusterRenderingService การดำเนินงานต้อง:

  • กำหนดเป็นบริการซิงเกิลโดยเพิ่มค่าต่อไปนี้ใน AndroidManifest.xml นี่เป็นสิ่งจำเป็นเพื่อให้แน่ใจว่าสำเนาเดียวของบริการ Instrument Cluster จะทำงาน แม้ในระหว่างการเริ่มต้นและการสลับผู้ใช้:
    android:singleUser="true"
  • ถือ BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE รับอนุญาตระบบ การค้ำประกันนี้ว่ามีเพียงบริการการแสดงผลแผงหน้าปัดรวมเป็นส่วนหนึ่งของภาพระบบ Android จะเคยผูกพันตาม CarService :
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

การใช้ InstrumentClusterRenderingService

เพื่อสร้างบริการ:

  1. เขียนคลาสที่ขยายจาก InstrumentClusterRenderingService แล้วเพิ่มรายการที่สอดคล้องกับของคุณ AndroidManifest.xml ไฟล์ ชั้นนี้จะควบคุมการแสดงผลที่แผงหน้าปัดและสามารถ (ขยะ) แสดงผลข้อมูลรัฐนำร่อง API
  2. ในช่วง onCreate() , ใช้บริการนี้เพื่อเริ่มต้นการสื่อสารกับฮาร์ดแวร์การแสดงผล ตัวเลือกได้แก่:
    • กำหนดจอแสดงผลรองที่จะใช้สำหรับแผงหน้าปัด
    • สร้างจอแสดงผลเสมือนเพื่อให้แอป Instrument Cluster แสดงผลและส่งภาพที่แสดงผลไปยังหน่วยภายนอก (โดยใช้รูปแบบการสตรีมวิดีโอ เช่น H.264)
  3. เมื่อการแสดงผลที่ระบุข้างต้นพร้อมบริการนี้ต้องเรียก InstrumentClusterRenderingService#setClusterActivityLaunchOptions() เพื่อกำหนดที่แน่นอน ActivityOptions ที่จะต้องใช้ในการแสดงกิจกรรมบนแผงหน้าปัด ใช้พารามิเตอร์เหล่านี้:
    • หมวดหมู่. CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • ActivityOptions. ActivityOptions อินสแตนซ์ที่สามารถใช้ในการเปิดตัวกิจกรรมในแผงหน้าปัด ยกตัวอย่างเช่นจากตัวอย่างการดำเนินงานที่แผงหน้าปัดใน AOSP:
      getService().setClusterActivityLaunchOptions(
         CATEGORY_NAVIGATION,
         ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
      
  4. เมื่อแผงหน้าปัดพร้อมกับกิจกรรมการแสดงผลบริการนี้ต้องเรียก InstrumentClusterRenderingService#setClusterActivityState() ใช้พารามิเตอร์เหล่านี้:
    • category CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • state Bundle สร้างขึ้นด้วย ClusterActivityState อย่าลืมให้ข้อมูลต่อไปนี้:
      • visible ระบุแผงหน้าปัดเป็นที่มองเห็นได้และพร้อมที่จะแสดงเนื้อหา
      • unobscuredBounds สี่เหลี่ยมที่กำหนดพื้นที่ในการแสดงผลแผงหน้าปัดที่มันปลอดภัยที่จะแสดงเนื้อหา ตัวอย่างเช่น พื้นที่ที่ครอบคลุมโดยแป้นหมุนและมาตรวัด
  5. แทนที่ Service#dump() วิธีการและรายงานข้อมูลสถานะที่มีประโยชน์สำหรับการแก้จุดบกพร่อง (ดู dumpsys สำหรับข้อมูลเพิ่มเติม)

ตัวอย่างการใช้งาน InstrumentClusterRenderingService

ตัวอย่างต่อไปนี้แสดง InstrumentClusterRenderingService การดำเนินงานซึ่งจะสร้าง VirtualDisplay ที่จะนำเสนอเนื้อหาที่แผงหน้าปัดบนจอแสดงผลทางกายภาพระยะไกล

อีกวิธีหนึ่งคือรหัสนี้สามารถผ่าน displayId ของจอแสดงผลรองทางกายภาพที่เชื่อมต่อกับ HU หากเป็นที่รู้จักกันว่าจะสามารถใช้ได้

/**
* Sample {@link InstrumentClusterRenderingService} implementation
*/
public class SampleClusterServiceImpl extends InstrumentClusterRenderingService {
   // Used to retrieve or create displays
   private final DisplayManager mDisplayManager;
   // Unique identifier for the display that will be used for instrument
   // cluster
   private final String mUniqueId = UUID.randomUUID().toString();
   // Format of the instrument cluster display
   private static final int DISPLAY_WIDTH = 1280;
   private static final int DISPLAY_HEIGHT = 720;
   private static final int DISPLAY_DPI = 320;
   // Area not covered by instruments
   private static final int DISPLAY_UNOBSCURED_LEFT = 40;
   private static final int DISPLAY_UNOBSCURED_TOP = 0;
   private static final int DISPLAY_UNOBSCURED_RIGHT = 1200;
   private static final int DISPLAY_UNOBSCURED_BOTTOM = 680;
   @Override
   public void onCreate() {
      super.onCreate();
      // Create a virtual display to render instrument cluster activities on
      mDisplayManager = getSystemService(DisplayManager.class);
      VirtualDisplay display = mDisplayManager.createVirtualDisplay(
          mUniqueId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_DPI, null,
          0 /* flags */, null, null);
      // Do any additional initialization (e.g.: start a video stream
      // based on this virtual display to present activities on a remote
      // display).
      onDisplayReady(display.getDisplay());
}
private void onDisplayReady(Display display) {
    // Report activity options that should be used to launch activities on
    // the instrument cluster.
    String category = CarInstrumentClusterManager.CATEGORY_NAVIGATION;
    ActionOptions options = ActivityOptions.makeBasic()
        .setLaunchDisplayId(display.getDisplayId());
    setClusterActivityOptions(category, options);
    // Report instrument cluster state.
    Rect unobscuredBounds = new Rect(DISPLAY_UNOBSCURED_LEFT,
        DISPLAY_UNOBSCURED_TOP, DISPLAY_UNOBSCURED_RIGHT,
        DISPLAY_UNOBSCURED_BOTTOM);
    boolean visible = true;
    ClusterActivityState state = ClusterActivityState.create(visible,
       unobscuredBounds);
    setClusterActivityState(category, options);
  }
}

การใช้ CarAppFocusManager

CarAppFocusManager API ให้วิธีการตั้งชื่อ getAppTypeOwner() ซึ่งจะช่วยให้บริการคลัสเตอร์เขียนโดย OEMs ที่จะทราบว่า app นำทางมีโฟกัสนำทางในเวลาใดก็ตาม OEMs สามารถใช้ที่มีอยู่ CarAppFocusManager#addFocusListener() วิธีการและจากนั้นใช้ getAppTypeOwner() เพื่อเรียนรู้แอปที่มีโฟกัส ด้วยข้อมูลนี้ OEM สามารถ:

  • สลับกิจกรรมที่แสดงในคลัสเตอร์เป็นกิจกรรมคลัสเตอร์ที่แอปการนำทางมีโฟกัสอยู่
  • สามารถตรวจจับได้ว่าแอปการนำทางที่เน้นมีกิจกรรมคลัสเตอร์หรือไม่ หากแอปการนำทางที่โฟกัสไม่มีกิจกรรมคลัสเตอร์ (หรือหากกิจกรรมดังกล่าวถูกปิดใช้งาน) OEM สามารถส่งสัญญาณนี้ไปยัง DIM ของรถยนต์เพื่อให้ระบบข้ามด้านการนำทางของคลัสเตอร์ไปเลย

ใช้ CarAppFocusManager การตั้งค่าและฟังสำหรับการมุ่งเน้นการประยุกต์ใช้ในปัจจุบันเช่นระบบนำทางใช้งานหรือคำสั่งเสียง โดยปกติจะมีเพียงหนึ่งอินสแตนซ์ของแอปพลิเคชันดังกล่าวที่ทำงานอยู่ (หรือเน้น) ในระบบ

ใช้ CarAppFocusManager#addFocusListener(..) วิธีการที่จะฟังสำหรับการเปลี่ยนแปลงโฟกัสแอป

import android.car.CarAppFocusManager;

...

Car car = Car.createCar(this);
mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE);
mAppFocusManager.addFocusListener(this, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);

...

public void onAppFocusChanged(int appType, boolean active) {
    // Use the CarAppFocusManager#getAppTypeOwner(appType) method call
    // to retrieve a list of active package names
}

ใช้ CarAppFocusManager#getAppTypeOwner(..) วิธีการที่จะดึงชื่อแพคเกจของเจ้าของปัจจุบันของแอพลิเคชันประเภทที่ได้รับอยู่ในโฟกัส วิธีนี้อาจจะกลับมามากกว่าชื่อแพคเกจหนึ่งถ้าเจ้าของปัจจุบันใช้ android:sharedUserId คุณลักษณะ

import android.car.CarAppFocusManager;

...

Car car = Car.createCar(this);
mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE);
List<String> focusOwnerPackageNames = mAppFocusManager.getAppTypeOwner(
              CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);

if (focusOwnerPackageNames == null || focusOwnerPackageNames.isEmpty()) {
        // No Navigation application has focus
        // OEM may choose to show their default cluster view
} else {
       // focusOwnerPackageNames
       // Use the PackageManager to retrieve the cluster activity for the package(s)
       // returned in focusOwnerPackageNames
}

...

ภาคผนวก: การใช้แอปพลิเคชันตัวอย่าง

AOSP จัดเตรียมแอปพลิเคชันตัวอย่างที่ใช้ Navigation State API

ในการรันแอปพลิเคชันตัวอย่างนี้:

  1. สร้างและแฟลช Android Auto บน HU ที่รองรับ ใช้การสร้าง Android และคำแนะนำการกะพริบเฉพาะสำหรับอุปกรณ์ของคุณ โปรดดูคำแนะนำ การใช้บอร์ดอ้างอิง
  2. เชื่อมต่อจอแสดงผลรองจริงกับ HU (หากรองรับ) หรือเปิด HU สำรองเสมือน:
    1. เลือกโหมดนักพัฒนาซอฟต์แวร์ในการตั้งค่า app
    2. ไปที่ตั้งค่า> ระบบ> Advanced> ตัวเลือกการพัฒนาซอฟต์แวร์> จำลองแสดงรอง
  3. รีบูตเครื่อง HU ClusterRenderingService บริการเชื่อมต่อกับจอแสดงผลรอง
  4. ในการเปิดแอป KitchenSink:
    1. เปิดลิ้นชัก
    2. ไปที่สถาบัน กลุ่ม
    3. คลิกเริ่มการเมตา

KitchenSink ขอโฟกัส NAVIGATION ซึ่งสั่งให้ DirectRenderingCluster บริการเพื่อแสดงส่วนติดต่อผู้ใช้ล้อเลียนขึ้นบนแผงหน้าปัด