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 Nguyên tắc về việc lái xe khi bị phân tâm.

Trang này mô tả các quy tắc Hạn chế trải nghiệm người dùng (UX) trên ô tô mà bạn có thể dùng để tạo nhiều cấu hình quy tắc Hạn chế 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 cần áp dụng trong thời gian chạy. Để biết thêm thông tin, hãy xem 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 Hạn chế trải nghiệm người dùng trên ô tô mới. Nếu nhà phát triển 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 tại địa phương), thì nhà phát triển có thể 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 này 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ế trải nghiệm người dùng khởi động lại ô tô đang ở chế độ Đỗ xe. Dịch vụ ô tô đảm bảo ô tô ở chế độ Đỗ xe 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òn được cung cấp để xây dựng cấu hình. Trạng thái của việc chọn số và tốc độ được chuyển đổi thành một trong 3 trạng thái lái xe:

  • Đỗ xe. Số ở chế độ Đỗ xe.
  • Không tải. Số không ở chế độ Đỗ xe và tốc độ bằng 0.
  • Đang di chuyển. Số không ở chế độ Đỗ 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 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 sẽ ánh xạ trạng thái lái xe với một tập hợp các quy tắc hạn chế về trải nghiệm người dùng /packages/services/Car/+/android17-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

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

Quá trình ánh xạ minh hoạ ở trên được xác định trước và định cấu hình dưới dạng tài nguyên XML. /packages/services/Car/+/android17-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java sau đó sẽ lưu các quy tắc vào bộ nhớ. Sau đó, dịch vụ sẽ ánh xạ 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à phát các quy tắc hạn chế hiện tại cho 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 tắc 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 thêm thẻ RestrictionMapping có physicalPort cho màn hình đó. Các quy tắc 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, các màn hình có Mã cổng vật lý 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 các 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ư teen. Trong ví dụ sau, các quy tắc hạn chế khác nhau được định cấu hình cho các chế độ defaultpassenger (trước đây, chỉ chế độ passenger được hỗ trợ):

<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ể 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ẽ dùng phương thức setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) trong CarUxRestrictionsManager).

API CarUxRestrictionsConfiguration

Các quy tắc hạn chế với CarUxRestrictionsConfiguration

Lớp CarUxRestrictionsConfiguration mới được ánh xạ theo tỷ lệ 1:1 với lược đồ cấu hình XML hiện tại. CarUxRestrictionsConfiguration có thể được tạo bằng CarUxRestrictions.Builder, xác thực cấu hình khi xây 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 lần lái xe 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);

Lưu cấu hình Hạn chế trải nghiệm người dùng mới

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 giá trị boolean để cho biết 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 Bộ phận trung tâm tích hợp (IHU) khởi động lại và ô tô đang đỗ. Về nội bộ, dịch vụ Hạn chế trải nghiệm người dùng chứa 2 tập hợp 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 quy tắc hạn chế về trải nghiệm người dùng và được nâng cấp lên Bản chính thức khi dịch vụ ô tô khởi động và khi ô tô đang đỗ.

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

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

Lỗi về địa chỉ

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

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

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

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

Nội dung sau đây mô tả các lượt tương tác xuất hiện trong sơ đồ thiết kế sau:

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

Hình 2. Các lượt tương tác về trạng thái lái xe

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

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

Các 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/+/android17-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Định nghĩa về các quy tắc hạn chế trải nghiệm người dùng.
/packages/services/Car/+/android17-release/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/+/android17-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Để mô phỏng trạng thái lái xe, hãy xem bài viết Kiểm thử.