OEM'ler için entegrasyon kılavuzu

Bu sayfada, VHAL'de çevirmeli girişlerin nasıl işleneceği, derlemenizi ve tüm uygulamalarda çevirme deneyiminin nasıl özelleştirileceğini öğreneceksiniz. OEM tarafından sağlanan başlatıcı gibi önceden yüklenmiş OEM uygulamaları için şu makaleye bakın: Araba Kullanıcı Arayüzü Kitaplığı (araba-ui-kitaplığı).

VHAL

Çevirmeli kumanda aşağıdaki işlemleri destekler:

  • Yukarı, aşağı, sola ve sağa sürükle
  • Saat yönünde ve saat yönünün tersine döndürün.
  • Orta düğmeye basın.
  • Geri düğmesine basın.
  • Ana sayfa düğmesine basın.
  • Telefon ve Medya gibi diğer düğmelere basın.

Şu konuyla ilgili dokümanlar için hardware/interfaces/automotive/vehicle/2.0/types.hal sayfasına göz atın: sistem özellikleri ve karşılık gelen int32Values.

VHAL, şu işlemleri gerçekleştirmelidir:

Hatırlatma

Kullanıcı döner kumandayı sağa ittiğinde VHAL, Aşağıdaki int32Values özelliklerine sahip HW_KEY_INPUT mülkü etkinliği Android'e aktarmak için:

  1. ACTION_DOWN
  2. KEYCODE_SYSTEM_NAVIGATION_RIGHT
  3. Hedef görüntülü reklam.

Kullanıcı döner kumandayı serbest bıraktığında VHAL aynı özelliği ve ayarı kullanmalıdır. anahtar kodu oluşturmak için ACTION_UP kullanın. Diğer yönlerdeki otomatik hatırlatmalar, ilgili tuş kodlarından birini kullanın.

Çapraz yönler için tuş kodları yoktur ancak VHAL, yatay ve dikey öğeleri birleştirebilir. etkinliği, donanım köşegenleri destekliyorsa köşegen oluşturulmasına neden olur. Örneğin, el hareketlerini solda ise şu verileri vermelidir:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN

Döner kumandanın her iki sırayla da (ve daha sonra) serbest bırakılması şu sonucu vermelidir:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

Kullanıcı, serbest bırakmadan önce çevirmeli kumandayı dik yönde itebilir. Örneğin, aşağıdaki senaryo:

Dik yön
Şekil 1. Dik yön
'nı inceleyin.

Bu işlem aşağıdaki etkinlik dizisini oluşturmalıdır:

  1. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  2. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN
  3. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  4. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

Çevirmeli kumanda basılı tutulurken tekrarlanan etkinlik oluşturulmamalıdır. tek bir yönde ilerler.

Döndür

Kullanıcı çevirmeli kumandayı saat yönünde bir tutma yeri (tıklama) döndürdüğünde (tıklama), VHAL HW_ROTARY_INPUT özelliğini aşağıdaki int32Values ile kullanmalıdır Android'e etkinlik göndermek için:

  1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
  2. Bir (1) çadırlı.
  3. Hedef görüntülü reklam.

Etkinliğin zaman damgası, nanosaniye cinsinden, geçen süreye ayarlanmalıdır.

Saat yönünün tersine bir (1) noktalı döndürme, aynı etkinliği oluşturmalıdır ancak Muhafaza sayısı için -1.

Aynı yönde hızlı bir şekilde arka arkaya birden fazla dönüş noktası oluşursa VHAL sisteme etkinliklerle aşırı yüklenmemek için kısıtlamaları tek bir etkinlik altında birleştirmesi gerekir. Bu durumda, etkinliğin zaman damgası, rotasyondaki ilk duraklamanın gerçekleştiği zaman olmalıdır. int32Values, art arda kilitlenmeler arasındaki nanosaniye sayısını içermelidir. sağlayabilir.

Örneğin, aşağıdaki rotasyon sırası:

  • t0 zamanında, kullanıcı bir kaydırma noktasını saat yönünün tersine döndürdü.
  • t0 + 5 ns zamanlarında, kullanıcı bir kilit noktasını saat yönünün tersine döndürdü.
  • t0 + 8 ns zamanlarında, kullanıcı bir kilit noktasını saat yönünün tersine döndürdü.

şu etkinliği oluşturmalıdır:

  • Tesis: HW_ROTARY_INPUT
  • Zaman damgası: t0
  • int32Values:
    1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
    2. -3 (saat yönünün tersine üç nokta).
    3. Hedef görüntülü reklam.
    4. Birinci ve ikinci kilitlenme arasında 5 ns.
    5. İkinci ve üçüncü duraklama arasında 3 ns.

Orta düğme

Kullanıcı orta düğmeye bastığında VHAL, HW_KEY_INPUT öğesini kullanmalıdır özelliğini kullanın:int32Values

  1. ACTION_DOWN
  2. KEYCODE_DPAD_CENTER
  3. Hedef görüntülü reklam.

Kullanıcı döner kumandayı serbest bıraktığında VHAL aynı özelliği kullanmalıdır. ve anahtar kodu eklemek için ACTION_UP kullanın.

Orta düğme basılı tutulduğunda tekrar etkinlikleri oluşturmayın.

Geri düğmesi

Kullanıcı Geri düğmesine bastığında VHAL, HW_KEY_INPUT özelliğini kullanın:int32Values

  1. ACTION_DOWN
  2. KEYCODE_BACK
  3. Hedef görüntülü reklam.

Kullanıcı döner kumandayı serbest bıraktığında VHAL aynı özelliği kullanmalıdır. ve anahtar kodu eklemek için ACTION_UP kullanın.

Orta düğme basılı tutulurken repeat etkinlikleri oluşturulmamalıdır.

Ana ekran düğmesi

Ana Sayfa düğmesini Geri düğmesi gibi, KEYCODE_HOME kullanın / KEYCODE_BACK.

Diğer düğmeler

Çevirmeli kumandada ek düğmeler varsa VHAL bunları işleyebilir. Android açısından çevirinin bir parçası olarak kabul edilmediğinden, OEM bunları seviyor. Bunlar genellikle Geri ve Ana Sayfa düğmeleri gibi ele alınır, ancak farklı tuş kodları kullanılır. Örneğin, KEYCODE_CALL veya KEYCODE_MUSIC.

Derleme yapılandırması

Çevirmeli gezinme, RotaryService adlı bir erişilebilirlik hizmeti tarafından sağlanmaktadır. Bu hizmeti cihazınızın sistem görüntüsüne dahil etmek için aşağıdaki satırı cihazınıza Makefile:

PRODUCT_PACKAGES += CarRotaryController

Hata ayıklama derlemelerine aşağıdaki paketleri de dahil etmek isteyebilirsiniz:

Çevirmeli hizmet, cihaz başlatıldığında ve bir kullanıcı tarafından otomatik olarak etkinleştirilir. geçiş yapılır. Bu şekilde kullanıcının kurulum sırasında döner kumandayı kullanabilmesi sağlanır.

Döner kumanda olan ve olmayan arabalarda aynı derlemeyi kullanırsanız gerekli kodun eklenmesi için CarRotaryController öğesini yukarıda gösterildiği gibi ekleyin teşekkür ederiz. Dönen arabalarda döner hizmetin etkinleştirilmesini önlemek için rotaryService dizesi kaynağını Boş dizeyle packages/services/Car/service. Aynı derlemeyi kullanacaksınız. Ancak çevrilen ve dönen olmayan cihazlar için ayrı ürün yapılandırmaları vardır. Yalnızca ikincisi yer paylaşımını da içerir.

Özelleştirme

OEM'ler, aşağıdakileri kullanarak odak bulma mantığını, odak noktasını ve bazı ek öğeleri kaynak bindirmelerinin olması gerekir:

  • car-ui-library packages/apps/Car/libs/car-ui-lib bölgesindedir
  • RotaryService, packages/apps/Car/RotaryController bölgesinde bulunuyor
  • Core, frameworks/base/core bölgesinde bulunuyor

Geçmişi sürükle

OEM, iki otomatik hatırlatma geçmişi türünün her birinin etkinleştirilip etkinleştirilmeyeceğini yapılandırabilir ve etkin durumda olması durumunda önbellek boyutu ve son kullanma politikası. Bu işlem, çeşitli car-ui-library'ı geçersiz kılarak yapılır kaynaklar.

Geçmiş önbelleğine odaklan

(Android 11 QPR3, Android 11 Araba, Android 12)
FocusArea başına bu önbellek, FocusArea simgesine geri dönerken odaklanılabilmesi için FocusArea. Bu önbellek, aşağıdaki car-ui-library kaynaklarının yer paylaşımıyla yapılandırılabilir:

  • car_ui_focus_history_cache_type:
    1. Önbellek devre dışı bırakıldı.
    2. Önbelleğin süresi bir süre sonra sona erer (aşağıya bakın).
    3. Önbelleğin süresi hiçbir zaman dolmaz.
  • car_ui_focus_history_expiration_period_ms: Önbellek türü iki (2) olarak ayarlanırsa önbellek süresi dolar (yukarıya bakın).

FocusArea geçmiş önbelleği

(Android 11 QPR3, Android 11 Araba, Android 12)
Bu önbellek, otomatik hatırlatmaların bir geçmişini depolar. Böylece ters yönde otomatik hatırlatmalar odağı aynı FocusArea değerine döndürün. Bu önbellek, şu car-ui-library kaynakları:

  • car_ui_focus_area_history_cache_type:
    1. Önbellek devre dışı bırakıldı.
    2. Önbelleğin süresi bir süre sonra dolar (aşağıya bakın).
    3. Önbelleğin süresi hiçbir zaman dolmaz.
  • car_ui_focus_area_history_expiration_period_ms: Kaç milisaniye önce önbellek türü 2 olarak ayarlanırsa önbelleğin süresi dolar (yukarıya bakın).
  • car_ui_clear_focus_area_history_when_rotating: Önbelleğin geçersiz kılınıp kılınmayacağı Kullanıcı kumandayı döndürdüğünde.

Döndürme

(Android 11 QPR3, Android 11 Araba, Android 12)
OEM, aşağıdakilerin geçerli olup olmadığını belirtmek için RotaryService öğesindeki iki tam sayı kaynağını geçersiz kılabilir dönüş için fare ivmesi gibi bir ivme vardır:

  • rotation_acceleration_3x_ms: Karar vermek için kullanılan zaman aralığı (milisaniye cinsinden) Google'ın kumandanın devir süresini kısaltması gerekir. Öğe bu duraklama ile bir önceki döndürme sınırlaması arasındaki aralık bu değerden küçüktür. üç tür dönme sınırlaması olarak ele alınır. 3× devre dışı bırakmak için bunu 2147483647 olarak ayarlayın ivme artışı.
  • rotation_acceleration_2x_ms: rotation_acceleration_3x_ms ile benzer. 2× hızlandırma için kullanılır. 2× hızlandırmayı devre dışı bırakmak için bunu 2147483647 olarak ayarlayın.

Hızlandırmanın en iyi şekilde çalışması için her bir aralık için döndürme gibi zorunlu VHAL tarafından. Aksi takdirde RotaryService, bunların göz önünde bulundurulduğu ve toplananların rotasyonu eşit olarak ayarlanır.

/**
     * Property to feed H/W rotary events to android
     *
     * int32Values[0] : RotaryInputType identifying which rotary knob rotated
     * int32Values[1] : number of detents (clicks), positive for clockwise,
     *                  negative for counterclockwise
     * int32Values[2] : target display defined in VehicleDisplay. Events not
     *                  tied to specific display must be sent to
     *                  VehicleDisplay#MAIN.
     * int32values[3 .. 3 + abs(number of detents) - 2]:
     *                  nanosecond deltas between pairs of consecutive detents,
     *                  if the number of detents is > 1 or < -1
     *
     * VehiclePropValue.timestamp: when the rotation occurred. If the number of
     *                             detents is > 1 or < -1, this is when the
     *                             first detent of rotation occurred.
     *
     * @change_mode VehiclePropertyChangeMode:ON_CHANGE
     * @data_enum RotaryInputType
     * @access VehiclePropertyAccess:READ
     */
    HW_ROTARY_INPUT = (
        0x0A20
        | VehiclePropertyGroup:SYSTEM
        | VehiclePropertyType:INT32_VEC
        | VehicleArea:GLOBAL),

Vurgulamaya odaklan

OEM, Android çerçevesindeki varsayılan odaklamayı geçersiz kılabilir ve car-ui-library'da öne çıkan bazı kaynaklar

Varsayılan odaklama

Android çerçevesi, selectableItemBackground Theme.DeviceDefault ayında bu özelliği, Core içinde item_background.xml anlamına gelir. OEM, Varsayılan odaklamanın çekilebilir ayarını değiştirmek için item_background.xml tuşlarına basın.

Bu çekilebilir, genellikle arka planı ayarlayan bir StateListDrawable olmalıdır. android:state_focused dahil olmak üzere farklı eyalet kombinasyonlarına göre ve android:state_pressed. Kullanıcı, çevirmeli kumandayı kullanarak bir görünüme odaklanır, android:state_focused true olur, ancak android:state_pressed false olacak. Kullanıcı daha sonra çevirmeli kumandada ortadaki düğme (hem android:state_focused hem de Kullanıcı düğmeyi basılı tutarken android:state_pressed true olacak. Kullanıcı düğmeyi bıraktığında yalnızca android:state_focused kalır true.

car-ui-library, Theme.DeviceDefault kaynağından türetilen bir tema kullanır. Sonuç olarak, bu yer paylaşımı, bu kitaplığı kullanan uygulamaları ve Theme.DeviceDefault Alakasız bir tema kullanan uygulamaları etkilemez. Theme.Material gibi.

car-ui-library'da öne çıkan yayınlara odaklanın

OEM, odağın nasıl vurgulandığını kontrol etmek için bazı car-ui-library kaynaklarını geçersiz kılabilir dikdörtgen olmayan (yuvarlak veya hap şekilli gibi) odak vurgusu içeren görünümlere Theme.DeviceDefault türetilmeyen bir tema kullanan uygulamalar. Bu kaynaklar, vurguların öne çıkan teori ile tutarlı olması için varsayılan odaklama vurgulaması çekilebilir.

(Android 11 QPR3, Android 11 Araba, Android 12)
Aşağıdaki kaynaklar, bir görünüme odaklanılıp basılmadığını belirtmek için kullanılır:

  • car_ui_rotary_focus_fill_color: Dolgu rengi.
  • car_ui_rotary_focus_stroke_color: Dış çizgi rengi.
  • car_ui_rotary_focus_stroke_width: Dış çizginin kalınlığı.

(Android 11 QPR3, Android 11 Araba, Android 12)
Aşağıdaki kaynaklar, bir görünüme odaklanıldığını ve basıldığını belirtmek için kullanılır:

  • car_ui_rotary_focus_pressed_fill_color: Dolgu rengi.
  • car_ui_rotary_focus_pressed_stroke_color: Dış çizgi rengi.
  • car_ui_rotary_focus_pressed_stroke_width: Dış çizginin kalınlığı.

Bazen bir düğmeye, kullanıcının dikkatini çekmek için ona düz bir arka plan rengi verilir. gösterildiği gibidir. Bu, odağın vurgulanmasını zorlaştırabilir.

Düz renkli arka planlı düğme
Şekil 2. Düz renkli arka planlı düğme
'nı inceleyin.

Bu durumda, geliştirici ikincil renkler:
  • (Android 11 QPR3, Android 11 Araba, Android 12)

    car_ui_rotary_focus_fill_secondary_color car_ui_rotary_focus_stroke_secondary_color
  • (Android 12)

    car_ui_rotary_focus_pressed_fill_secondary_color car_ui_rotary_focus_pressed_stroke_secondary_color

Renklerden herhangi biri şeffaf olabilir ve iki boyut da sıfır olabilir. Örneğin, yalnızca dolgu veya ana hatlar olmasını istiyordum.

FocusArea vurgulaması

(Android 11 QPR3, Android 11 Araba, Android 12)
FocusArea, alt öğelerinden biri olduğunda iki tür vurgu çizebilir emin olabilirsiniz. İstenirse her ikisi de birlikte kullanılabilir. Bu özellik şurada varsayılan olarak devre dışıdır: AOSP'dir ancak car-ui-library kaynaklarını geçersiz kılarak etkinleştirilebilir:

  • car_ui_enable_focus_area_foreground_highlight: Şunun üzerine vurgu çiz: FocusArea ve alt öğeleri. AOSP'de bu çekilebilir, bir program için FocusArea civarında. OEM'ler car_ui_focus_area_foreground_highlight çekilebilir.
  • car_ui_enable_focus_area_background_highlight: Vurgunun üst kısmına bir vurgu çizin: FocusArea ancak alt öğelerinin arkasında. AOSP'de bu çekilebilir değer katı bir dolgudur. OEM'ler, car_ui_focus_area_background_highlight çekilebilirliğini geçersiz kılabilir.

Giriş Yöntemi Düzenleyicileri

Giriş Yöntemi Düzenleyicileri (IME) giriş yöntemleridir. Örneğin, dokunmatik klavye.

(Android 11 QPR3, Android 11 Araba, Android 12)
OEM, default_touch_input_method dizesi kaynağıyla yer paylaşımlı olmalıdır öğesinin ComponentName değerini belirtmek için RotaryService öğesinde IME'si de kullanabilirsiniz. Örneğin, OEM, Android Automotive ile sağlanan IME'yi kullanıyorsa proje yaşam döngüsü boyunca com.google.android.apps.automotive.inputmethod/.InputMethodService

(Android 11 QPR3, Android 11 Araba, Android 12)
OEM özellikle çevirmelilik için bir IME oluşturduysa, IME'yi rotary_input_method kaynağında ComponentName. Bu kaynak varsa, kullanıcı ana birimle her etkileşimde bulunduğunda belirtilen IME kullanılır. çevirme ve Orta düğmesi aracılığıyla kontrol edebilirsiniz. Kullanıcı dokunduğunda için önceki IME kullanılır. Geri düğmesi (ve döner menüdeki diğer düğmeler denetleyici) IME seçimi üzerinde herhangi bir etkisi yoktur. Bu kaynak yer paylaşımlı değilse IME geçişi yapılmaz gerçekleşir. Karton çevirmeyi desteklemediğinden kullanıcı çevirme aracını kullanarak metin giremiyor kontrol eder.

RotaryIME, demo amaçlı bir döner IME'dir. Temel düzeyde olsa da, yukarıda açıklanan otomatik IME geçişini deneyin. RotaryIME için kaynak kodu packages/apps/Car/tests/RotaryIME/ yolunda bulunabilir.

Ekran dışı otomatik hatırlatmalar

Varsayılan olarak, kullanıcı ekranın kenarından uzaklaştırmaya çalıştığında hiçbir şey olmaz. OEM, herhangi bir şunların kombinasyonu:

  1. AccessibilityService tarafından tanımlanan genel bir işlem. Örneğin, GLOBAL_ACTION_BACK
  2. KEYCODE_BACK gibi bir anahtar kodu.
  3. URL olarak gösterilen bir etkinliği başlatma niyeti.

(Android 11 QPR3, Android 11 Araba, Android 12)
Bunlar, aşağıdaki dizi kaynaklarının RotaryService:

  • off_screen_nudge_global_actions: Şu durumlarda gerçekleştirilecek genel işlemler dizisi kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa sürükler. Global olarak yapılan işlem yok bu dizinin ilgili öğesi -1 olduğunda gerçekleştirilir.
  • off_screen_nudge_key_codes: Yerleştirilecek tıklama etkinlikleri anahtar kodları dizisi Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa kaydırdığında. Etkinlik yok bu dizinin ilgili öğesi 0 (KEYCODE_UNKNOWN) ise enjekte edilir.
  • off_screen_nudge_intents: Şu durumlarda etkinlik başlatmak için kullanılan amaçlar dizisi kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa sürükler. Etkinlik yok bu dizinin ilgili öğesi boşsa başlatılır.

Diğer yapılandırmalar

Şu RotaryService kaynaklarını yer paylaşımlı olarak kullanmanız gerekir:

  • (Android 11 QPR3, Android 11 Araba, Android 12)
    config_showHeadsUpNotificationOnBottom: olup olmadığını temsil eden boole değeri uyarı bildirimleri üstte değil altta gösterilmelidir. Bu config_showHeadsUpNotificationOnBottom ile aynı değere sahiptir Boole kaynağı: frameworks/base/packages/CarSystemUI/res/values/config.xml
  • (Android 11 QPR3, Android 11 Araba, Android 12)
    notification_headsup_card_margin_horizontal: Şunun için sol ve sağ kenar boşluğu: uyarı bildirim penceresi. Bu, notification_headsup_card_margin_horizontal şurada kaynağı daralt: packages/apps/Car/Notification/res/values/dimens.xml
  • (Android 12)
    excluded_application_overlay_window_titles: Bir dizi olarak değerlendirilmemesi gereken pencerelerin başlıklarına Bu, başlıkları içermelidir TaskViews veya TaskDisplayAreas değerlerini temsil eden uygulama pencerelerinin sayısı. Varsayılan olarak bu liste yalnızca "Haritalar"ı içerir.

Şu RotaryService kaynağını yer paylaşımlı olarak kullanabilirsiniz:

  • (Android 11 QPR3, Android 11 Araba, Android 12)
    long_press_ms: Etkinliğin kaç milisaniye olduğunu temsil eden tam sayı değeri Uzun basmayı tetiklemek için orta düğmenin basılı tutulması gerekir. Sıfır, sistemi gösterir varsayılan uzun basma zaman aşımı kullanılmalıdır. Bu, varsayılan değerdir.