Các hạn chế về trải nghiệm người dùng trên ô tô

Trước khi tiếp tục, hãy xem lại Nguyên tắc về việc gây mất tập trung khi lái xe.

Trang này mô tả các quy tắc Hạn chế về trải nghiệm người dùng (UX) trên ô tô mà bạn có thể sử dụng để tạo nhiều cấu hình quy tắc Hạn chế về trải nghiệm người dùng (ví dụ: Liên minh Châu Âu so với Nhật Bản), sau đó xác định bộ quy tắc nào sẽ áp dụng tại thời gian chạy. Để biết thêm thông tin, hãy xem phần CarUxRestrictions.

Dịch vụ Hạn chế trải nghiệm người dùng trên ô tô cho phép nhà phát triển xác định một cấu hình mới về Hạn chế trải nghiệm người dùng trên ô tô. Nếu muốn sửa đổi các quy tắc hạn chế (chẳng hạn như để tuân thủ các tiêu chuẩn an toàn cục bộ), nhà phát triển có thể sử dụng API để xác định cấu hình mới.

API để thiết lập cấu hình chỉ tồn tại trong cấu hình mới. Nói cách khác, cấu hình không có hiệu lực ngay lập tức. Thay vào đó, cấu hình mới sẽ được tải khi dịch vụ Hạn chế về trải nghiệm người dùng khởi động lại xe ở chế độ Đỗ. Dịch vụ xe đảm bảo xe ở chế độ Đỗ trước khi tải lại cấu hình mới.

Ngoài phương thức dịch vụ Hạn chế trải nghiệm người dùng mới, các API được cung cấp để tạo cấu hình. Trạng thái lựa chọn số và tốc độ được chuyển đổi thành một trong ba trạng thái lái xe:

  • Đã đỗ xe. Thiết bị trong công viên.
  • Rảnh. Hộp số không ở vị trí Đỗ xe và tốc độ bằng 0.
  • Đang di chuyển. Hộp số không ở vị trí Đỗ xe và tốc độ không bằng 0.

Để tìm hiểu cách ứng dụng sử dụng trạng thái lái xe của ô tô và các quy tắc hạn chế tương ứng về trải nghiệm người dùng, hãy xem bài viết Sử dụng trạng thái lái xe của ô tô và các quy tắc hạn chế về trải nghiệm người dùng.

Cấu hình hạn chế dựa trên trạng thái lái xe

Để ngăn người lái xe bị phân tâm, Android liên kết trạng thái lái xe với một tập hợp các Hạn chế về trải nghiệm người dùng /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • Đã đỗ xe. Không bị hạn chế.
  • Rảnh. Không có video và không có màn hình cấu hình.
  • Đang di chuyển. Bị hạn chế hoàn toàn (bắt buộc phải tuân thủ tất cả các quy định hạn chế).

Mối liên kết được minh hoạ ở trên được xác định trước và được định cấu hình dưới dạng tài nguyên XML. Sau đó, /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java sẽ lưu các quy tắc trong bộ nhớ. Sau đó, dịch vụ này sẽ liên kết trạng thái lái xe hiện tại với các quy tắc hạn chế về trải nghiệm người dùng và truyền các quy tắc hạn chế hiện tại đến toàn bộ hệ thống.

<!-- No restrictions when car is parked -->
<DrivingState car:state="parked">
    <Restrictions car:requiresDistractionOptimization="false"
                  car:uxr="baseline"/>
</DrivingState>

<!-- Restrictions when car is idling -->
<DrivingState car:state="idling">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="no_video|no_config"/>
</DrivingState>

<!-- Restrictions for speed >= 0 m/s -->
<DrivingState car:state="moving" car:minSpeed="0.0">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="fully_restricted"/>
</DrivingState>

Cấu hình cho nhiều màn hình

Theo mặc định, không có quy định hạn chế nào được áp dụng cho các màn hình bổ sung. Để tạo cấu hình hạn chế cho nhiều màn hình, hãy đưa thẻ RestrictionMapping vào với physicalPort cho màn hình đó. Các quy định hạn chế thích hợp sẽ tự động được áp dụng cho từng màn hình. Trong ví dụ sau, màn hình có Mã cổng thực 1 và 2 có cấu hình khác nhau:

<RestrictionMapping car:physicalPort="1">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/>
       </DrivingState>
   </RestrictionMapping>

   <RestrictionMapping car:physicalPort="2">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
       </DrivingState>
  </RestrictionMapping>

Cấu hình cho chế độ hạn chế

Bạn có thể chọn bất kỳ tên nào cho chế độ này, chẳng hạn như thiếu niên. Trong ví dụ sau, các quy định hạn chế khác nhau được định cấu hình cho chế độ mặc địnhngười đi kèm (trước đây, chỉ hỗ trợ chế độ người đi kèm):

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
Bạn có thể sử dụng API để đặt bất kỳ tên chuỗi nào cho chế độ này. Ví dụ: phương thức setRestrictionMode(@NonNull String mode) trong CarUxRestrictionsManager. (Trước đây, bạn sẽ sử dụng phương thức setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) trong CarUxRestrictionsManager).

API CarUxRestrictionsConfiguration

Các quy định hạn chế với CarUxRestrictionsConfiguration

Lớp mới CarUxRestrictionsConfiguration được liên kết 1:1 với giản đồ cấu hình XML hiện tại. Bạn có thể tạo CarUxRestrictionsConfiguration bằng CarUxRestrictions.Builder để xác thực cấu hình khi tạo bản dựng().

new CarUxRestrictionsConfiguration.Builder()
        // Explicitly set restrictions for each driving state.
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
                /* requiresOptimization= */ false,
                /* restrictions= */ UX_RESTRICTIONS_BASELINE)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
                true,
                UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
                true,
                UX_RESTRICTIONS_FULLY_RESTRICTED)
        // Set restriction parameters.
        .setMaxStringLength(int max)
        .setMaxCumulativeContentItems(int max)
        .setMaxContentDepth(int max)
        // Build a new CarUxRestrictionsConfiguration.
        .build();

API CarUxRestrictionsManager

Đặt CarUxRestrictionsConfiguration cho ổ tiếp theo bằng CarUxRestrictionsManager. Phương thức này yêu cầu quyền, Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION.

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

Duy trì cấu hình mới của các quy định hạn chế về trải nghiệm người dùng

Khi một cấu hình mới được truyền vào, dịch vụ Hạn chế trải nghiệm người dùng sẽ trả về một boolean để cho biết liệu cấu hình mới đã được lưu thành công hay chưa. Cấu hình mới này chỉ được dùng khi Đầu phát trung tâm tích hợp (IHU) khởi động lại và xe đang đỗ. Trong nội bộ, dịch vụ Hạn chế trải nghiệm người dùng chứa hai nhóm cấu hình:

  • Bản chính thức. Mặc dù không bắt buộc, nhưng cấu hình này thường xuất hiện. Dịch vụ Hạn chế trải nghiệm người dùng sẽ đọc cấu hình này khi khởi động.
  • Theo giai đoạn. Cấu hình này cũng không bắt buộc, không ảnh hưởng đến các Giới hạn về trải nghiệm người dùng và được chuyển sang chế độ Phát hành công khai khi dịch vụ bảo dưỡng ô tô bắt đầu và khi ô tô được đỗ.

Cấu hình sản xuất

Hình 1. Cấu hình sản xuất

Lỗi địa chỉ

Cho đến khi nhận được thông tin trạng thái lái xe từ CarPropertyManager (ví dụ: trong quá trình khởi động), các quy định hạn chế về trải nghiệm người dùng sẽ không được thực thi. Hệ thống sẽ hoạt động như thể trạng thái lái xe là Đã đỗ.

Nếu không đọc được cấu hình đã lưu (ví dụ: kết quả SettingNotFoundException), dịch vụ Hạn chế trải nghiệm người dùng sẽ quay lại chế độ hạn chế hoàn toàn được mã hoá cứng:

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

Trạng thái lái xe và các hạn chế đối với người dùng

Nội dung sau đây mô tả các hoạt động tương tác hiển thị trong sơ đồ thiết kế sau:

Tương tác với trạng thái lái xe

Hình 2. Tương tác với trạng thái lái xe

Các thuộc tính dùng để lấy trạng thái lái xe

Sử dụng 3 VehiclePropertyIds sau đây để lấy trạng thái lái xe:

API có sẵn cho ứng dụng

Mã này nằm ở các vị trí sau:

Vị trí
CarUxRestrictionsManager
API công khai để đăng ký các thay đổi về Quy tắc hạn chế trải nghiệm người dùng.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Định nghĩa về các quy định hạn chế về trải nghiệm người dùng.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
API hệ thống để đăng ký các thay đổi về trạng thái lái xe.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Để mô phỏng trạng thái lái xe, hãy xem phần Kiểm thử.