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 kỹ Nguyên tắc tránh 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 trong 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 Hạn chế trải nghiệm người dùng trên ô tô mới. 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 tại địa phương), 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ỉ duy trì 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ụ UX Restrictions khởi động lại xe đ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 để tạo cấu hình. Trạng thái chọn số và tốc độ được chuyển đổi thành một trong 3 trạng thái lái xe:

  • Đã đỗ xe. Đưa xe về số P.
  • Đang ở chế độ chờ. Hộp số không ở chế độ Đỗ xe và tốc độ bằng 0.
  • Đang di chuyển. Hộp số không ở chế độ Đỗ xe và tốc độ không phải là 0.

Để tìm hiểu cách các ứ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 phần 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

Để tránh gây phân tâm cho người lái xe, Android sẽ liên kết trạng thái lái xe với một nhóm Hạn chế về trải nghiệm người dùng /packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • Đã đỗ xe. Không hạn chế.
  • Đang ở chế độ chờ. 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 có tất cả các hạn chế).

Hoạt động ánh xạ minh hoạ ở trên được xác định trước và định cấu hình dưới dạng một tài nguyên XML. Sau đó, /packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java sẽ lưu các quy tắc vào 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à 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 định hạn chế nào được áp dụng cho các màn hình khác. Để 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 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ó Port Id (Mã cổng) vật lý 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ư trẻ em. Trong ví dụ sau, các chế độ hạn chế khác nhau được định cấu hình cho chế độ mặc định và chế độ hành khách (trước đây, chỉ chế độ hành khách đượ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 tên chuỗi bất kỳ 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).

CarUxRestrictionsConfiguration API

Các 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. CarUxRestrictionsConfiguration có thể được tạo bằng CarUxRestrictions.Builder, xác thực cấu hình khi tạo build().

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();

CarUxRestrictionsManager API

Đặt CarUxRestrictionsConfiguration cho ổ đĩa 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 giữ 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 Đầ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 2 nhóm cấu hình:

  • Phát hành công khai. 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.
  • Đang phát hành theo giai đoạn. Ngoài ra, cấu hình này là không bắt buộc, không ảnh hưởng đến các hạn chế về trải nghiệm người dùng và được chuyển sang phiên bản phát hành khi dịch vụ ô tô khởi động và khi ô tô đỗ.

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 thông tin về trạng thái lái xe được nhận từ CarPropertyManager (ví dụ: trong quá trình khởi động), các quy tắc hạn chế 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 là Đỗ xe.

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ế độ được mã hoá cứng và bị 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 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 xuất hiện 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 được dùng để suy ra trạng thái lái xe

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

Các API mà ứng dụng có thể sử 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ế đối với trải nghiệm người dùng.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Định nghĩa các hạn chế về trải nghiệm người dùng.
/packages/services/Car/+/android16-qpr1-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/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

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