Araç kullanma durumunu ve kullanıcı deneyimi kısıtlamalarını kullanma

Bu sayfada, uygulamaların dikkat dağıtıcı öğeler için optimize edilmiş (DO) kullanıcı arayüzlerine nasıl sorunsuz bir şekilde geçiş yapabileceği açıklanmaktadır. Bir aracın sürüş durumunun nasıl kullanılacağı ve ilgili kullanıcı deneyimi kısıtlamaları açıklanmaktadır. Araç kullanıcı deneyimi (UX) kısıtlamaları hakkında daha fazla bilgi edinmek için Park, Rölantide ve Hareket Halinde olmak üzere üç sürüş durumunun ayrıntılı olarak açıklandığı Araç Kullanıcı Deneyimi Kısıtlamaları başlıklı makaleyi inceleyin.

Kitle

Bu içerik, aracın sürüş durumundaki değişikliklere ve buna bağlı olarak uygulanan kullanıcı deneyimi kısıtlamalarına uyum sağlayan uygulamalar tasarlamak isteyenler için hazırlanmıştır.

Teknik ayrıntılar

CarDrivingStateManager

Bir aracın sürüş durumu (Park, Rölantide veya Hareket Halinde), Araç Donanım Soyutlama Katmanı (VHAL) tarafından sağlanan sensör değerlerinden türetilir. Araç hızı ve mevcut vites seçimi gibi temel sensör bilgileri, aracın mevcut sürüş durumunu belirlemek için kullanılır.

CarDrivingStateEvent.

@SystemApis sağlar. Bu, API'lere yalnızca Platform Dahili, Paketlenmiş APK'lar (ör. SysUI veya Ayarlar) ve ayrıcalıklı APK'lar (ör. GMSCore) erişebilir demektir. API'ler, sürüş durumuna (android.car.permission.CAR_DRIVING_STATE) özel izinlerle korunur. Sürüş durumu bilgilerine erişmesi gereken istemciler bu izni istemelidir.

CarUxRestrictionsManager

Sürüş durumuna bağlı bir kullanıcı arayüzü gösteren uygulamalar, CarUxRestrictionsManager adlı sistemi dinlemelidir. Bu sistem, sürüş durumundan kullanıcı deneyimi kısıtlamalarına eşlemeyi soyutlar. Böylece uygulamaların farklı pazar güvenlik koşullarına uyum sağlaması gerekmez.

Not: Bu etkinlikler, Sürücünün dikkatini dağıtma yönergeleri'nde açıklandığı gibi dikkat dağıtıcı unsurları en aza indirme olarak işaretlenmelidir. Etkinlikler uygun şekilde işaretlenmezse engellenir.

Bunun yerine uygulamalar, kullanıcı arayüzü veya kullanıcı deneyimiyle ilgili her şey için CarDrivingStateManager tarafından sunulan mutlak sürüş durumunu değil, CarUxRestrictionsManager tarafından sunulan kısıtlamaları izler.

Kod örneği

Aşağıdaki örnek kodda, bir uygulamanın kullanıcı deneyimi kısıtlamalarını nasıl izlediği gösterilmektedir:

  1. Araç kitaplığı paketlerini içe aktarın:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener) uygulayın. Bu dinleyici, CarUxRestrictionsManager'a kaydedildiğinde kullanıcı deneyimi kısıtlamalarında bir değişiklik olduğunda çağrılır. Gerekirse kısıtlama değişikliklerini dikkat dağıtıcı unsurları en aza indirecek şekilde yönetin:
    @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 adlı bir araba örneği oluşturmak ve araba hizmetine bağlanmak için araba API'lerini çağırın:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
  4. CarUxRestrictionsManager almak için mCar.getCarManager() - mCarUxRestrictionsManager numaralı telefonu arayın:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. Yukarıdaki 2. adımda uygulanan mUxRChangeListenerCarUxRestrictionsManager çağrısı mCarUxRestrictionsManager.registerListener() ile kaydetmek için:
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Tamamlanmış örnek kod bloğu (3. ila 5. adımlar arasında oluşturulur), sürüş durumu değiştiğinde dinleyicinin kısıtlama değişikliklerini almasına neden olur:

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 nesnesi iki tür bilgi sağlar:

  1. Şu anda dikkat dağıtıcı öğelerin optimize edilmesi gerekiyor mu?
  2. Cevabınız evet ise şu anda hangi kısıtlamalar uygulanıyor?

CarUxRestrictions, getCurrentUxRestrictions() veya dinleyici geri çağırma işlevinden elde edildiğinde uygulamalar artık DistractionOptimized'ın gerekli olup olmadığını belirlemek için isRequiresDistractionOptimization() API'yi kullanabilir. Bu işlem false döndürüyorsa dikkat dağıtıcı olmayacak şekilde optimize edilmiş olma şartı yoktur ve uygulama herhangi bir etkinliği güvenli bir şekilde çalıştırabilir.

Optimizasyon gerekiyorsa geçerli kısıtlama grubunu almak için getActiveRestrictions() API'sini kullanın. Bu API, geçerli olan tüm kısıtlamaların bit maskesi olan bir int döndürür. Şu anda bildirilen kısıtlama grubu CarUxRestrictions altında listelenir.

Not: Kısıtlamalarda yakın gelecekte küçük değişiklikler yapılması beklenmektedir.

Örneğin, bir uygulama video oynatmayla ilgili bir kısıtlama olup olmadığını belirlemek istiyorsa CarUxRestrictions nesnesini aldıktan sonra kısıtlamayı kontrol etmelidir:

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

DrivingState

CarDrivingStateManager, aracın gerçek sürüş durumunu (Park, Rölantide veya Hareket Halinde) gösterir. CarDrivingStateManager API'leri, CarUxRestrictionsManager'a benzer şekilde çağrılabilir. Uygulamalar bir dinleyici kaydedebilir veya mevcut sürüş durumunu alabilir. Araç kullanma durumu CarDrivingStateEvent olarak döndürülür.

CarDrivingStateEvent.

değişirse onDrivingStateChanged() yöntemi yeni CarDrivingStateEvent ile çağrılır.

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

Test

Sürüş durumunu değiştirmek için vites ve hız değiştirmeyi taklit edebilirsiniz. Araç etkinliklerini eklemek için bir ADB kabuk komutu kullanın. Bu, geliştirme ve test için yararlı olabilir.

Sürüş etkinliklerini simüle etmek için:

  1. Hızı 0 olarak ayarlamak için:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. Vitesi Parked olarak ayarlamak için (PARKED değerini işaret eden CarDrivingStateEvent'i simüle etmek için):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. Hız hâlâ 0 iken vitesi Drive olarak ayarlamak için (CarDrivingStateEvent'in IDLING değerini gösterdiğini simüle etmek için):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. Hızı saniyede 30 metreye ayarlamak için (MOVING değerini işaret eden CarDrivingStateEvent'i simüle etmek için):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30