Araba sürüş durumunu ve UX kısıtlamalarını kullanın

Bu sayfada, uygulamaların dikkat dağıtma açısından optimize edilmiş (DO) kullanıcı arayüzlerine nasıl zarif bir şekilde geçiş yapabileceği açıklanmaktadır. Bir otomobilin sürüş durumunun nasıl tüketileceğinin yanı sıra ilgili kullanıcı deneyimi kısıtlamalarını da açıklar. Araç Kullanıcı Deneyimi (UX) kısıtlamaları hakkında daha fazla bilgi için Park Etme, Rölantide ve Hareket Etme olmak üzere üç sürüş durumunun ayrıntılarını içeren Araç Kullanıcı Deneyimi Kısıtlamaları bölümüne bakın.

Kitle

Bu içerik, bir otomobilin sürüş durumundaki değişikliklere ve buna bağlı olarak uygulanan UX kısıtlamalarına uyum sağlayan uygulamalar tasarlamak isteyenler için sağlanmıştır.

Teknik detaylar

ArabaSürüşDevlet Müdürü

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

CarDrivingStateEvent .

@SystemApis'i sağlar; bu, yalnızca Platform Dahili Öğelerinin, Paketlenmiş APK'ların (SysUI veya Ayarlar gibi) ve Ayrıcalıklı APK'ların (GMSCore gibi) API'lere erişebileceği anlamına gelir. API'ler, android.car.permission.CAR_DRIVING_STATE sürüş durumuna özgü izinlerle korunur. Sürüş durumu bilgilerine erişmesi gereken istemcilerin bu izni talep etmesi gerekir.

CarUxRestrictionsManager

Sürüş durumuna bağlı bir kullanıcı arayüzü görüntüleyen uygulamaların, sürüş durumundan UX kısıtlamalarına kadar olan eşlemeyi soyutlayan CarUxRestrictionsManager dinlemesi gerekir; böylece uygulamaların farklı pazar güvenliği gereksinimlerine göre ayarlanmasına gerek kalmaz.

Not : Bu aktivitelerin, Sürücünün dikkatini dağıtma kurallarında açıklandığı gibi, dikkat dağıtma optimizasyonu yapılmış olarak işaretlenmesi gerekir . Etkinlikler uygun şekilde işaretlenmezse engellenir.

Bunun yerine uygulamalar, kullanıcı arayüzü veya kullanıcı deneyimiyle ilgili herhangi bir ş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 kod, bir uygulamanın UX kısıtlamalarını nasıl izlediğini gösterir:

  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, UX kısıtlamalarında bir değişiklik meydana geldiğinde çağrılır. Dikkat dağıtmayı optimize etmek için kısıtlama değişikliklerini gerektiği şekilde gerçekleştirin:
    @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 adında 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 çağırın:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Yukarıdaki Adım 2'de uygulanan mUxRChangeListener CarUxRestrictionsManager ile kaydetmek için mCarUxRestrictionsManager.registerListener() çağrısını yapın:
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Tamamlanan örnek kod bloğu (Adım 3'ten Adım 5'e kadar oluşturulan), sürücü durumu değiştiğinde dinleyicinin kısıtlama değişikliklerini almasıyla sonuçlanır:

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

CarUxKısıtlamaları

CarUxRestrictions nesnesi iki tür bilgi sağlar:

  1. Dikkat dağıtmanın optimize edilmesine yönelik mevcut bir gereksinim var mı?
  2. Eğer öyleyse, şu anda hangi kısıtlamalar yürürlükte?

CarUxRestrictions, getCurrentUxRestrictions() veya dinleyici geri aramasından elde edildiğinde, uygulamalar artık Distraction Optimized'ın gerekli olup olmadığını belirlemek için isRequiresDistractionOptimization() API'sini kullanabilir. Bu false döndürürse, Dikkat Dağıtma için Optimize Edilmiş olma zorunluluğu yoktur ve uygulama herhangi bir etkinliği güvenli bir şekilde çalıştırabilir.

Optimizasyon gerekiyorsa, kısıtlama kümesini uygulamaya koymak için getActiveRestrictions() API'sini kullanın. Bu API, şu anda yürürlükte olan tüm kısıtlamaların bir bit maskesi olan int değerini döndürür. Şu anda bildirilen kısıtlamalar kümesi CarUxRestrictions altında listelenmiştir.

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

Örneğin, bir uygulama video oynatmaya yönelik bir kısıtlamanın mevcut olup olmadığını belirlemek istiyorsa CarUxRestrictions nesnesini aldıktan sonra uygulamanın kısıtlamayı kontrol etmesi gerekir:

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

Sürüş Durumu

CarDrivingStateManager, aracın gerçek sürüş durumunu sunar (Park Edilmiş, Rölantide veya Hareket Ediyor). CarDrivingStateManager API'leri, CarUxRestrictionsManager'a benzer şekilde çağrılabilir. Uygulamalar bir dinleyiciyi kaydedebilir veya mevcut sürüş durumunu alabilir. Sürüş durumu CarDrivingStateEvent olarak döndürülür.

CarDrivingStateEvent .

değişiklikler, 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 yapmak

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

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

  1. Hızı 0'a ayarlamak için:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. Vitesi Park edilmiş olarak ayarlamak için (CarDrivingStateEvent'in PARKED'i işaret etmesini simüle etmek için):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Hız hala 0'dayken vitesi Drive'a ayarlamak için (CarDrivingStateEvent'in IDLING'i işaret etmesini 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 (CarDrivingStateEvent'in HAREKETE GEÇİRME'yi işaret etmesini simüle etmek için):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30