Sử dụng các hạn chế về trải nghiệm người dùng và trạng thái lái xe

Trang này giải thích cách các ứng dụng có thể chuyển đổi linh hoạt để gây mất tập trung được tối ưu hoá (DO). Hướng dẫn này mô tả cách sử dụng trạng thái lái của ô tô cũng như trải nghiệm người dùng tương ứng. Để biết thêm thông tin về các quy định hạn chế liên quan đến Trải nghiệm người dùng trên ô tô, hãy xem Các quy định hạn chế về trải nghiệm người dùng trên ô tô, trong đó nêu chi tiết ba trạng thái lái xe là Đỗ xe, Không hoạt động và Đang di chuyển.

Đối tượng người xem

Nội dung này được cung cấp cho những ai muốn thiết kế ứng dụng thích ứng với các thay đổi trong một trạng thái lái xe của ô tô và các giới hạn trải nghiệm người dùng tương ứng được áp đặt.

Chi tiết kỹ thuật

DriveStateManager

Trạng thái lái xe của ô tô (Đã đỗ xe, Không hoạt động hoặc Đang di chuyển) được lấy từ các giá trị cảm biến do lớp trừu tượng phần cứng xe (VHAL). Thông tin cảm biến cơ bản, chẳng hạn như tốc độ xe và lựa chọn hộp số hiện tại, dùng để lấy thông tin về trạng thái lái hiện tại của xe.

CarDrivingStateEvent.

dịch vụ này cung cấp @SystemApis, nghĩa là chỉ nền tảng Nội bộ, APK theo gói (chẳng hạn như SysUI hoặc Các chế độ cài đặt) và APK có đặc quyền (chẳng hạn như) GMSCore có thể truy cập vào các API này. Các API được bảo vệ bằng dành riêng cho trạng thái lái xe android.car.permission.CAR_DRIVING_STATE. Khách hàng yêu cầu quyền truy cập vào thông tin về trạng thái lái xe phải yêu cầu quyền này.

CarUxRestrictManager

Những ứng dụng cho thấy giao diện người dùng phụ thuộc vào trạng thái lái xe phải theo dõi CarUxRestrictionsManager, Thao tác này sẽ tóm tắt ánh xạ từ trạng thái lái xe sang các hạn chế về trải nghiệm người dùng để các ứng dụng không cần điều chỉnh cho phù hợp với các yêu cầu khác nhau về an toàn trên thị trường.

Lưu ý: Những hoạt động này phải được đánh dấu là được tối ưu hoá để chống phân tâm, như mô tả trong Hướng dẫn về sự phân tâm của người lái xe. Nếu không được đánh dấu phù hợp, các hoạt động sẽ bị chặn.

Thay vào đó, ứng dụng sẽ giám sát các quy định hạn chế do CarUxRestrictManager đặt ra và không phải là trạng thái lái xe tuyệt đối mà CarDriveStateManager hiển thị cho bất kỳ hoạt động nào liên quan đến người dùng giao diện hoặc trải nghiệm người dùng.

Mã mẫu

Mã mẫu sau đây minh hoạ cách một ứng dụng giám sát các hạn chế về trải nghiệm người dùng:

  1. Nhập các gói thư viện ô tô:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. Triển khai CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). Trình nghe này, khi được đăng ký với CarUxRestrictManager, được gọi khi có thay đổi về các quy định hạn chế về trải nghiệm người dùng xảy ra. Xử lý các thay đổi về quy tắc hạn chế để tối ưu hoá khả năng chống phân tâm (nếu cần):
    @Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager;
    private CarUxRestrictions mCurrentUxRestrictions;
    
    /* Implement the onUxRestrictionsChangedListener interface */
    private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener =
                new CarUxRestrictionsManager.OnUxRestrictionsChangedListener()
        {
            @Override
            public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) {
            mCurrentUxRestrictions = carUxRestrictions;
            /* Handle the new restrictions */
            handleUxRestrictionsChanged(carUxRestrictions);
            }
        };
      
  3. Gọi các API cho ô tô để tạo một thực thể ô tô có tên là mCar và kết nối với dịch vụ dành cho ô tô:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
  4. Gọi mCar.getCarManager() - mCarUxRestrictionsManager để nhận CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. Để đăng ký mUxRChangeListener được triển khai ở Bước 2 ở trên bằng phương thức CarUxRestrictionsManager gọi mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Khối mã mẫu hoàn chỉnh (được tạo ở Bước 3 đến Bước 5) sẽ dẫn đến trình nghe nhận các thay đổi về hạn chế khi trạng thái ổ đĩa thay đổi:

mCar = Car.createCar(context);
if (mCar == null) {
// handle car connection error
}

CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);

mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
mUxrChangeListener.onUxRestrictionsChanged(
mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Hạn chế của CarUx

Đối tượng CarUxRestrict cung cấp 2 loại thông tin:

  1. Hiện tại, có yêu cầu nào về việc tối ưu hoá khả năng chống phân tâm không?
  2. Nếu có thì những quy định hạn chế nào đang được áp dụng?

Khi mã CarUxRestrict lấy từ: getCurrentUxRestrictions() hoặc lệnh gọi lại trình nghe, hiện các ứng dụng có thể sử dụng API isRequiresDistractionOptimization() để xác định xem Sự mất tập trung Tối ưu hoá là trường bắt buộc. Nếu giá trị này trả về false, thì bạn không bắt buộc phải dùng trạng thái Sự mất tập trung Được tối ưu hoá nên ứng dụng có thể chạy mọi hoạt động một cách an toàn.

Nếu bắt buộc phải tối ưu hoá, hãy sử dụng API getActiveRestrict() để lấy bộ hạn chế phù hợp. Chiến dịch này API trả về int (số nguyên). Đây là một mặt nạ bit của tất cả các hạn chế hiện đang có hiệu lực. Chiến lược phát hành đĩa đơn bộ hạn chế đang được thông báo được liệt kê trong CarUxRestrictions.

Lưu ý: Dự kiến sẽ có những thay đổi nhỏ đối với bộ quy định hạn chế xảy ra trong tương lai gần.

Ví dụ: nếu một ứng dụng muốn xác định xem có hạn chế phát video hay không, dựa trên khi nhận được đối tượng CarUxRestrict, ứng dụng phải kiểm tra quy định hạn chế:

int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions();
if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) {
      handleStopPlayingVideo();
}

Trạng thái lái xe

CarDriveStateManager hiển thị trạng thái lái thực tế của xe (Đã đỗ xe, Idling hoặc Đang di chuyển). Các API CarDriveStateManager có thể được gọi theo cách tương tự như CarUxRestrictManager. Các ứng dụng có thể đăng ký một trình nghe hoặc nhận trạng thái lái xe hiện tại. Trạng thái lái xe được trả về dưới dạng CarDriveStateEvent.

CarDrivingStateEvent.

thay đổi, phương thức onDrivingStateChanged() sẽ được gọi bằng phương thức mới CarDrivingStateEvent

import android.car.Car;
/* For CarDrivingState */
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;

mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager(
       Car.CAR_DRIVING_STATE_SERVICE);
/* Register the listener (implemented below) */
mDrivingStateManager.registerListener(mDrivingStateEventListener);
/* While we wait for a change to be notified, query the current state */
mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState();

private final CarDrivingStateManager.CarDrivingStateEventListener
mDrivingStateEventListener =
       new CarDrivingStateManager.CarDrivingStateEventListener() {
   @Override
   public void onDrivingStateChanged(CarDrivingStateEvent event) {
       mDrivingStateEvent = event;
       /* handle the state change accordingly */
       handleDrivingStateChange();
   }
};

Thử nghiệm

Bạn có thể bắt chước việc chuyển sang số và tốc độ để thay đổi trạng thái lái xe. Sử dụng ADB shell để chèn sự kiện trên xe. Việc này có thể giúp ích cho việc phát triển và kiểm thử.

Cách mô phỏng sự kiện lái xe:

  1. Cách đặt tốc độ thành 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. Cách đặt thiết bị ở chế độ Đỗ xe (để mô phỏng Car DriveStateEvent trỏ đến PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. Để đặt bánh răng thành Drive, với tốc độ vẫn ở 0 (để mô phỏng tính năng chỉ CarDriveStateEvent tới IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. Cách đặt tốc độ thành 30 mét/giây (để mô phỏng CarusingStateEvent trỏ đến MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30