Trang này giải thích cách các ứng dụng có thể chuyển đổi linh hoạt sang giao diện người dùng được tối ưu hoá để giảm sự phân tâm (DO). Tài liệu này mô tả cách sử dụng trạng thái lái xe của ô tô cũng như các quy định 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 quy định hạn chế đối với Trải nghiệm người dùng (UX) trên ô tô, hãy xem phần Các quy định hạn chế đối với Trải nghiệm người dùng trên ô tô. Phần này trình bày chi tiết về 3 trạng thái lái xe là Đã đỗ, Đang ở chế độ rảnh và Đang di chuyển.
Đối tượng người xem
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 các thay đổi về trạng thái lái xe của ô tô và các hạn chế tương ứng về trải nghiệm người dùng.
Thông tin chi tiết về kỹ thuật
CarDrivingStateManager
Trạng thái lái xe của ô tô (Đã đỗ, Đang ở chế độ rảnh 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 của xe (VHAL) cung cấp. Thông tin cảm biến cơ bản, chẳng hạn như tốc độ xe và chế độ chọn số hiện tại, được dùng để xác định trạng thái lái xe hiện tại của xe.
CarDrivingStateEvent
.
cung cấp @SystemApis, nghĩa là chỉ các Nền tảng nội bộ, tệp APK đi kèm (chẳng hạn như SysUI hoặc
Cài đặt) và tệp APK đặc quyền (chẳng hạn như) GMSCore mới có thể truy cập vào các API này. Các API được bảo vệ bằng các quyền dành riêng cho trạng thái lái xe android.car.permission.CAR_DRIVING_STATE
. Ứng dụng cần 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.
CarUxRestrictionsManager
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
. CarUxRestrictionsManager
sẽ tóm tắt mối liên kết từ trạng thái lái xe đến 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 các yêu cầu về an toàn khác nhau trên thị trường.
Lưu ý: Các hoạt động này phải được đánh dấu là được tối ưu hoá để không gây mất tập trung, như mô tả trong Nguyên tắc về việc gây mất tập trung cho người lái xe. Nếu không được đánh dấu tương ứng, các hoạt động đó sẽ bị chặn.
Thay vào đó, ứng dụng sẽ theo dõi các quy định hạn chế do CarUxRestrictionsManager hiển thị chứ không phải trạng thái lái xe tuyệt đối do CarDrivingStateManager hiển thị đối với mọi nội dung liên quan đến giao diện người dùng 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 theo dõi các quy định hạn chế về trải nghiệm người dùng:
- 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;
- Triển khai
CarUxRestrictionManager.OnUxRestrictionsChangedListener
(mUxRChangeListener
). Trình nghe này, khi được đăng ký với CarUxRestrictionsManager, sẽ đượ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ử lý các thay đổi về quy định hạn chế để tối ưu hoá 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); } };
- Gọi các API ô tô để tạo một thực thể ô tô có tên là mCar và kết nối với dịch vụ ô tô:
mCar = Car.createCar(context); if (mCar == null) { // handle car connection error }
- Gọi
mCar.getCarManager() - mCarUxRestrictionsManager
để lấyCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Để đăng ký
mUxRChangeListener
được triển khai ở Bước 2 ở trên bằng lệnh gọiCarUxRestrictionsManager
mCarUxRestrictionsManager.registerListener()
:mCarUxRestrictionsManager.registerListener(mUxrChangeListener); mUxrChangeListener.onUxRestrictionsChanged( mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
Khối mã mẫu đã hoàn tất (được tạo trong Bước 3 đến Bước 5) sẽ khiến trình nghe nhận được các thay đổi về quy tắc hạn chế khi trạng thái của ổ đĩ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());
CarUxRestrictions
Đối tượng CarUxRestrictions cung cấp hai loại thông tin:
- Hiện có yêu cầu nào về việc tối ưu hoá yếu tố gây mất tập trung không?
- Nếu có, thì hiện tại có những quy định hạn chế nào?
Khi CarUxRestrictions được lấy từ getCurrentUxRestrictions()
hoặc lệnh gọi lại trình nghe, các ứng dụng hiện có thể sử dụng API isRequiresDistractionOptimization()
để xác định xem có cần tính năng Tối ưu hoá để giảm sự phân tâm hay không. Nếu hàm này trả về false
, thì không có yêu cầu nào về việc Tối ưu hoá để chống phân tâm và ứng dụng có thể chạy mọi hoạt động một cách an toàn.
Nếu cần tối ưu hoá, hãy sử dụng API getActiveRestrictions() để lấy bộ hạn chế hiện có. API này trả về một int, là một mặt nạ bit của tất cả các quy định hạn chế hiện đang có hiệu lực. Nhóm các quy định hạn chế hiện được thông báo được liệt kê trong CarUxRestrictions
.
Lưu ý: Chúng tôi dự kiến sẽ có một số thay đổi nhỏ đối với bộ hạn chế này trong thời gian sắp tới.
Ví dụ: nếu một ứng dụng muốn xác định xem có quy định 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 quy định hạn chế đó:
int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions(); if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) { handleStopPlayingVideo(); }
DrivingState
CarDrivingStateManager trình bày trạng thái lái xe thực tế của xe (Đã đỗ, Đang ở chế độ rảnh hoặc Đang di chuyển). Bạn có thể gọi các API CarDrivingStateManager tương tự như CarUxRestrictionsManager. Ứng dụng có thể đăng ký 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 CarDrivingStateEvent.
CarDrivingStateEvent
.
thay đổi, phương thức onDrivingStateChanged()
sẽ được gọi bằng 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(); } };
Thử nghiệm
Bạn có thể mô phỏng việc thay đổi số và tốc độ để thay đổi trạng thái lái xe. Sử dụng lệnh shell ADB để chèn các sự kiện xe. Điều này có thể hữu ích cho việc phát triển và kiểm thử.
Cách mô phỏng sự kiện lái xe:
- Cách đặt tốc độ thành 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- Cách đặt hộp số thành Đỗ xe (để mô phỏng CarDrivingStateEvent trỏ đến PARKED):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- Để đặt chế độ sang số thành Lái xe, với tốc độ vẫn ở mức 0 (để mô phỏng CarDrivingStateEvent trỏ đến IDLING):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
- Cách đặt tốc độ thành 30 mét/giây (để mô phỏng CarDrivingStateEvent trỏ đến MOVING):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30