محدودیت های حالت رانندگی و UX را مصرف کنید

این صفحه توضیح می‌دهد که چگونه برنامه‌ها می‌توانند به خوبی به رابط‌های کاربری بهینه‌سازی حواس‌پرتی (DO) انتقال یابند. نحوه مصرف حالت رانندگی خودرو و همچنین محدودیت‌های تجربه کاربر مربوطه را شرح می‌دهد. برای اطلاعات بیشتر در مورد محدودیت‌های تجربه کاربر خودرو (UX)، به محدودیت‌های تجربه کاربر خودرو مراجعه کنید، که جزئیات سه حالت رانندگی پارک شده، بی‌حرکت، و در حال حرکت را نشان می‌دهد.

حضار

این محتوا برای کسانی ارائه می‌شود که می‌خواهند برنامه‌هایی طراحی کنند که با تغییرات در وضعیت رانندگی خودرو و محدودیت‌های UX اعمال شده مربوطه سازگار شوند.

جزییات فنی

CarDrivingStateManager

وضعیت رانندگی خودرو (پارک شده، در حال حرکت، یا در حال حرکت) از مقادیر حسگر ارائه شده توسط لایه انتزاعی سخت افزار خودرو (VHAL) مشتق شده است. اطلاعات پایه حسگر، مانند سرعت خودرو و انتخاب دنده فعلی، برای استخراج وضعیت رانندگی فعلی خودرو استفاده می شود.

CarDrivingStateEvent .

که @SystemApis را ارائه می کند، به این معنی که فقط پلتفرم های داخلی، APK های همراه (مانند SysUI یا تنظیمات)، و APK های دارای امتیاز (مانند) GMSCore می توانند به API ها دسترسی داشته باشند. APIها با مجوزهای مخصوص وضعیت رانندگی android.car.permission.CAR_DRIVING_STATE محافظت می شوند. مشتریانی که نیاز به دسترسی به اطلاعات وضعیت رانندگی دارند باید این مجوز را درخواست کنند.

CarUxRestrictionsManager

آن دسته از برنامه‌هایی که رابط کاربری وابسته به وضعیت رانندگی را نشان می‌دهند باید به CarUxRestrictionsManager گوش دهند، که نقشه‌برداری را از حالت رانندگی به محدودیت‌های UX خلاصه می‌کند تا برنامه‌ها نیازی به تنظیم الزامات مختلف ایمنی بازار نداشته باشند.

توجه : این فعالیت‌ها باید به‌عنوان بهینه‌سازی حواس‌پرتی علامت‌گذاری شوند، همانطور که در دستورالعمل‌های حواس‌پرتی راننده توضیح داده شده است. اگر فعالیت‌ها بر اساس آن علامت‌گذاری نشده باشند، مسدود می‌شوند.

در عوض، برنامه‌ها محدودیت‌هایی را که توسط CarUxRestrictionsManager در معرض دید قرار می‌گیرند و نه وضعیت رانندگی مطلقی که توسط CarDrivingStateManager برای هر چیزی که مربوط به رابط کاربری یا تجربه کاربر است، نظارت می‌کند.

نمونه کد

کد نمونه زیر نحوه نظارت یک برنامه بر محدودیت های UX را نشان می دهد:

  1. بسته‌های کتابخانه خودرو را وارد کنید:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ) را پیاده سازی کنید. این شنونده، زمانی که در CarUxRestrictionsManager ثبت می شود، زمانی که تغییری در محدودیت های UX رخ می دهد، فراخوانی می شود. در صورت نیاز، تغییرات محدودیت را مدیریت کنید تا حواس پرتی بهینه شود:
    @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. برای ایجاد یک نمونه خودرو به نام mCar و اتصال به سرویس خودرو، APIهای خودرو را فراخوانی کنید:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. با mCar.getCarManager() - mCarUxRestrictionsManager تماس بگیرید تا CarUxRestrictionsManager دریافت کنید:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. برای ثبت mUxRChangeListener اجرا شده در مرحله 2 بالا با CarUxRestrictionsManager ، mCarUxRestrictionsManager.registerListener() را فراخوانی کنید:
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

بلوک تکمیل شده کد نمونه (ایجاد شده در مرحله 3 تا مرحله 5) منجر به دریافت تغییرات محدودیت توسط شنونده در هنگام تغییر وضعیت درایو می شود:

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

شی CarUxRestrictions دو نوع اطلاعات را ارائه می دهد:

  1. آیا نیاز فعلی برای بهینه سازی حواس پرتی وجود دارد؟
  2. اگر چنین است، در حال حاضر چه محدودیت هایی وجود دارد؟

هنگامی که CarUxRestrictions از getCurrentUxRestrictions() یا پاسخ تماس شنونده به دست می‌آید، اکنون برنامه‌ها می‌توانند از API isRequiresDistractionOptimization() برای تعیین اینکه آیا Distraction Optimized مورد نیاز است یا خیر استفاده کنند. اگر این مقدار false برگرداند، نیازی به بهینه‌سازی حواس‌پرتی وجود ندارد و یک برنامه می‌تواند با خیال راحت هر فعالیتی را اجرا کند.

اگر بهینه سازی مورد نیاز است، از API getActiveRestrictions() برای به دست آوردن مجموعه محدودیت های موجود استفاده کنید. این API یک int را برمی‌گرداند که کمی ماسک از تمام محدودیت‌های موجود در حال حاضر است. مجموعه محدودیت‌هایی که در حال حاضر اعلام شده است در قسمت CarUxRestrictions فهرست شده‌اند.

توجه: تغییرات جزئی در مجموعه محدودیت ها در آینده نزدیک پیش بینی می شود.

به عنوان مثال، اگر برنامه ای بخواهد تعیین کند که آیا محدودیتی برای پخش ویدیو وجود دارد یا خیر، پس از دریافت شی CarUxRestrictions، برنامه باید محدودیت را بررسی کند:

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

Driving State

CarDrivingStateManager وضعیت واقعی رانندگی وسیله نقلیه (پارک شده، بیکار، یا در حال حرکت) را نشان می دهد. API های CarDrivingStateManager را می توان مشابه CarUxRestrictionsManager نامید. برنامه ها می توانند شنونده را ثبت کنند یا وضعیت رانندگی فعلی را دریافت کنند. حالت رانندگی به عنوان CarDrivingStateEvent برگردانده می شود.

CarDrivingStateEvent .

تغییرات، متد onDrivingStateChanged() با 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();
   }
};

آزمایش کردن

برای تغییر حالت رانندگی می توانید تغییر دنده و سرعت را تقلید کنید. از یک فرمان پوسته ADB برای تزریق رویدادهای خودرو استفاده کنید. این می تواند توسعه و آزمایش مفیدی باشد.

برای شبیه سازی رویدادهای رانندگی:

  1. برای تنظیم سرعت روی 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. برای تنظیم دنده روی Parked (برای شبیه‌سازی CarDrivingStateEvent با اشاره به PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. برای تنظیم دنده روی Drive، با سرعت هنوز روی 0 (برای شبیه‌سازی CarDrivingStateEvent با اشاره به IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. برای تنظیم سرعت روی 30 متر در ثانیه (برای شبیه سازی CarDrivingStateEvent با اشاره به MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30