Tiêu thụ trạng thái lái xe ô tô và các hạn chế về UX

Trang này giải thích cách ứng dụng có thể chuyển đổi sang giao diện người dùng được tối ưu hóa (DO) một cách nhẹ nhàng. Nó mô tả cách hiểu trạng thái lái xe của ô tô cũng như các hạn chế tương ứng về trải nghiệm người dùng. Để biết thêm thông tin về các hạn chế Trải nghiệm người dùng ô tô (UX), hãy xem Hạn chế trải nghiệm người dùng ô tô , trong đó nêu chi tiết ba trạng thái lái xe là Đỗ xe, Chạy không tải và Đang di chuyển.

Khán giả

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

Chi tiết kỹ thuật

XeLái XeNhà NướcQuản Lý

Trạng thái lái xe của ô tô (Đỗ, Chạy không tải 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) cung cấp. Thông tin cơ bản của cảm biến, chẳng hạn như tốc độ xe và lựa chọn số hiện tại, được sử dụng để xác định trạng thái lái hiện tại của xe.

CarDrivingStateEvent .

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

Trình quản lý hạn chế CarUx

Những ứng dụng hiển thị giao diện người dùng phụ thuộc vào trạng thái lái xe phải nghe CarUxRestrictionsManager , ứng dụng này trừu tượng hóa ánh xạ từ trạng thái lái xe đến các hạn chế UX để ứng dụng không cần điều chỉnh theo các yêu cầu an toàn khác nhau của thị trường.

Lưu ý : Các hoạt động này phải được đánh dấu là tối ưu hóa sự phân tâm, như được mô tả trong Nguyên tắc phân tâm của người lái xe . Nếu các hoạt động không được đánh dấu tương ứng, chúng sẽ bị chặn.

Thay vào đó, các ứng dụng giám sát các hạn chế do CarUxRestrictionsManager đưa ra chứ không phải trạng thái lái xe tuyệt đối được CarDrivingStateManager đưa ra đối với bất kỳ điều gì liên quan đến giao diện người dùng hoặc trải nghiệm người dùng.

Mẫu mã

Mã mẫu sau đây minh họa cách ứng dụng giám sát các hạn chế UX:

  1. Nhập 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 CarUxRestrictionsManager , sẽ được gọi khi xảy ra thay đổi về hạn chế UX. Xử lý các thay đổi hạn chế để tối ưu hóa sự 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 ô tô để tạo một phiên bản ô tô có tên mCar và kết nối với dịch vụ ô 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 CarUxRestrictionsManager hãy gọi mCarUxRestrictionsManager.registerListener() :
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Khối mã mẫu đã hoàn chỉnh (được tạo từ Bước 3 đến Bước 5) dẫn đến việc trình nghe nhận được các thay đổi 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ế Ux của ô tô

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

  1. Hiện tại có yêu cầu nào về việc tối ưu hóa sự phân tâm không?
  2. Nếu vậy, những hạn chế nào hiện đang được áp dụng?

Khi CarUxRestrictions được lấy từ getCurrentUxRestrictions() hoặc lệnh gọi lại của trình nghe, giờ đây ứng dụng có thể sử dụng API isRequiresDistractionOptimization() để xác định xem có cần Tối ưu hóa sự phân tâm hay không. Nếu kết quả này trả về false thì không cần phải Tối ưu hóa sự phân tâm và ứng dụng có thể chạy bất kỳ hoạt động nào một cách an toàn.

Nếu cần tối ưu hóa thì hãy sử dụng API getActiveRestrictions() để có được bộ hạn chế tại chỗ. API này trả về int , đây là một chút che giấu tất cả các hạn chế hiện có hiệu lực. Tập hợp các hạn chế hiện đượ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ộ hạn chế trong tương lai gần.

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

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

Lái xeNhà nước

CarDrivingStateManager trình bày trạng thái lái thực tế của xe (Đỗ, Chạy không tải hoặc Đang di chuyển). API CarDrivingStateManager có thể được gọi tương tự như CarUxRestrictionsManager. Ứng dụng có thể đăng ký người 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ề là CarDrivingStateEvent.

CarDrivingStateEvent .

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

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

Kiểm tra

Bạn có thể bắt chước việc chuyển số và tốc độ để thay đổi trạng thái lái xe. Sử dụng lệnh shell ADB để đưa vào các sự kiện xe. Đây có thể là sự phát triển và thử nghiệm hữu ích.

Để mô phỏng các sự kiện lái xe:

  1. Để đặt tốc độ thành 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. Để đặt thiết bị thành Đã đỗ (để mô phỏng CarDrivingStateEvent trỏ tới ĐÃ ĐẬU):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Để đặt thiết bị thành Drive, với tốc độ vẫn ở mức 0 (để mô phỏng CarDrivingStateEvent trỏ tới IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. Để đặt tốc độ thành 30 mét mỗi giây (để mô phỏng CarDrivingStateEvent trỏ tới DI CHUYỂN):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30