OEM'ler için Entegrasyon Kılavuzu

Bu makale, VHAL'da döner girişlerin nasıl işleneceğini, yapınızı döner hizmeti içerecek şekilde nasıl yapılandıracağınızı ve döner deneyimi tüm uygulamalarda nasıl özelleştireceğinizi açıklar. Böyle bir OEM tarafından sağlanan başlatıcısı gibi önceden yüklenmiş OEM uygulamalar için bkz Araç UI Arşivi (araba-ui-kütüphane) .

VHAL

Döner bir kontrolör aşağıdaki eylemleri destekler:

  • Yukarı, aşağı, sola ve sağa sürükleyin.
  • Saat yönünde ve saat yönünün tersine döndürün.
  • Ortadaki düğmeye basın.
  • Geri tuşuna basınız.
  • Ana Sayfa düğmesine basın.
  • Telefon ve Medya gibi diğer düğmelere basın.

Bkz hardware/interfaces/automotive/vehicle/2.0/types.hal sistemi özellikleri üzerinde dokümantasyon ve karşılık gelen int32Values .

VHAL şu eylemleri gerçekleştirmelidir:

Dürtmek

Kullanıcı döner denetleyici hakkını iter zaman VHAL kullanmalıdır HW_KEY_INPUT aşağıdaki özelliği int32Values Android'e bir olay göndermek için:

  1. ACTION_DOWN
  2. KEYCODE_SYSTEM_NAVIGATION_RIGHT
  3. Hedef gösterimi.

Kullanıcı döner düğmeyi serbest bıraktığında, VHAL ile aynı özellik ve anahtar kodu kullanmak gerekir ACTION_UP . Diğer yönlerdeki dürtmeler, karşılık gelen anahtar kodlarını kullanmalıdır.

Köşegenler için anahtar kodlar yoktur, ancak donanım köşegenleri destekliyorsa VHAL yatay ve dikey bir olayı bir köşegen oluşturmak için birleştirebilir. Örneğin, yukarı ve sola doğru dürtmek şunları üretmelidir:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN

Her iki sırada da (ve ardından) döner denetleyicinin serbest bırakılması şunları üretmelidir:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

Kullanıcı, serbest bırakmadan önce döner kumandayı dikey yönde itebilir. Örneğin, aşağıdaki senaryo:

dik yön
Şekil 1 dik yönde

Bu, aşağıdaki olay 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

Döner kontrol bir doğrultuda tutulurken Resim tekrar etkinlik oluşturulmalıdır.

Döndür

Ne zaman bir mandal (tıklama) tarafından kullanıcı döndüğü döner denetleyici saat yönünde, kullanması gereken VHAL HW_ROTARY_INPUT aşağıdaki özelliği int32Values Android'e bir olay göndermek için:

  1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
  2. Bir (1) tetik.
  3. Hedef gösterimi.

Olayın zaman damgası, nanosaniye cinsinden geçen süreye ayarlanmalıdır.

Bir (1) kademeli saat yönünün tersine dönüş, aynı olayı oluşturmalıdır, ancak tetik sayısı için -1 olmalıdır.

Hızlı bir şekilde aynı yönde birden fazla dönüş tetiklemesi meydana gelirse, VHAL, sistemi olaylarla aşırı yüklememek için kilitleri tek bir olayda birleştirmelidir. Bu durumda, olayın zaman damgası, ilk döndürme hareketinin gerçekleştiği zaman olmalıdır. int32Values dönme ardışık mandallar arasında nanosaniye dizi içermelidir.

Örneğin, aşağıdaki döndürme sırası:

  • t0 anında, kullanıcı saat yönünün tersine bir mandal döndürdü.
  • t0 + 5 ns zamanında, kullanıcı saat yönünün tersine bir mandal döndürdü.
  • t0 + 8 ns zamanında, kullanıcı saat yönünün tersine bir mandal döndürdü.

bu olayı oluşturmalıdır:

  • Özellik: HW_ROTARY_INPUT
  • Zaman Damgası: t0
  • int32Values :
    1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
    2. -3 (saat yönünün tersine üç tetik).
    3. Hedef gösterimi.
    4. Birinci ve ikinci kilit arasında 5 ns.
    5. İkinci ve üçüncü tetik arasında 3 ns.

orta düğme

Kullanıcı Merkezi düğmesine bastığında, VHAL kullanmalıdır HW_KEY_INPUT aşağıdaki özelliği int32Values Android'e bir olay göndermek için:

  1. ACTION_DOWN
  2. KEYCODE_DPAD_CENTER
  3. Hedef gösterimi.

Kullanıcı döner düğmeyi serbest bıraktığında, VHAL ile aynı özellik ve anahtar kodu kullanmak gerekir ACTION_UP .

Merkezi düğmesi basılı tutulduğunda tekrar olayları oluşturmaz.

Geri düğmesi

Kullanıcı geri düğmesine bastığında, VHAL kullanmalıdır HW_KEY_INPUT aşağıdaki özelliği int32Values Android'e bir olay göndermek için:

  1. ACTION_DOWN
  2. KEYCODE_BACK
  3. Hedef gösterimi.

Kullanıcı döner düğmeyi serbest bıraktığında, VHAL ile aynı özellik ve anahtar kodu kullanmak gerekir ACTION_UP .

Merkezi düğmesi basılı tutulurken yok tekrar olaylar oluşturulmalıdır.

Ana menü tuşu

Yapacağınız Geri düğmesi gibi fakat Home tuşuna Kulp KEYCODE_HOME yerine KEYCODE_BACK .

Diğer düğmeler

Döner kontrolör herhangi bir ek düğme içeriyorsa, VHAL bunları OEM'in istediği şekilde kullanabilir, çünkü bunlar Android açısından rotasyonun bir parçası olarak kabul edilmez. Bunlar tipik olarak Geri ve Ana Sayfa düğmeleri gibi işlenir, ancak farklı tuş kodları ile. Örneğin, KEYCODE_CALL veya KEYCODE_MUSIC .

Yapı yapılandırması

Döner navigasyon adlı bir erişilebilirlik hizmeti tarafından sağlanmaktadır RotaryService . Bu hizmeti cihazınızın sistem görüntüsüne dahil etmek için makefile dosyanıza aşağıdaki satırı ekleyin:

PRODUCT_PACKAGES += CarRotaryController

Hata ayıklama yapılarına aşağıdaki paketleri de dahil etmek isteyebilirsiniz:

Döner hizmet, cihaz önyüklendiğinde ve bir kullanıcı geçişi gerçekleştiğinde otomatik olarak etkinleştirilir. Bu, kullanıcının kurulum sırasında döner kontrolörü kullanabilmesini sağlar.

Birlikte ve bir döner denetleyici olmadan otomobiller için aynı yapı kullanırsanız, eklemek CarRotaryController yukarıda kadar gerekli kod yapı dahil olduğunu gösterildiği gibi. Olmayan döner arabalarda etkin olmaktan döner hizmetini engellemek için bindirmek için statik bir RRO oluşturmak rotaryService dize kaynağı packages/services/Car/service boş bir dize ile. Döner ve döner olmayan cihazlar için aynı yapıyı kullanacaksınız, ancak farklı ürün konfigürasyonlarına sahip olacaksınız. Yalnızca ikincisi kaplamayı içerir.

özelleştirme

OEM'ler, aşağıdaki konumlardaki kaynak katmanları aracılığıyla odak bulma mantığını, odak vurgusunu ve bazı ek öğeleri özelleştirebilir:

  • araba ui-kütüphane yer almaktadır packages/apps/Car/libs/car-ui-lib
  • RotaryService bulunan packages/apps/Car/RotaryController
  • Core bulunan frameworks/base/core

dürtme geçmişi

OEM, iki tür dürtme geçmişinin etkinleştirilip etkinleştirilmeyeceğini ve etkinse önbellek boyutunu ve sona erme ilkesini yapılandırabilir. Tüm bunlar, çeşitli araç-ui-kütüphane kaynaklarını geçersiz kılarak yapılır.

Odak geçmişi önbelleği

(Android 11 QPR3, Android 11 Araba, Android 12)
Bu per- FocusArea önbellek saklar en son dahilinde görünümü odaklı FocusArea için arkasını itelenirken o odaklanmış böylece FocusArea . Bu önbellek, aşağıdaki araç-ui-kütüphane kaynakları üst üste bindirilerek yapılandırılabilir:

  • car_ui_focus_history_cache_type :
    1. Önbellek devre dışı.
    2. Önbellek bir süre sonra sona erecektir (aşağıya bakın).
    3. Önbellek asla sona ermez.
  • car_ui_focus_history_expiration_period_ms : önbellek tipi iki (2) olarak ayarlanırsa önbellek süresi dolmadan önce kaç milisaniye (yukarıya bakınız).

FocusArea geçmiş önbelleği

(Android 11 QPR3, Android 11 Araba, Android 12)
Bu önbellek saklar Tepki bir geçmişi böylece ters yönde nudging aynı odağı dönebilmek FocusArea . Bu önbellek, aşağıdaki araç-ui-kütüphane kaynakları üst üste bindirilerek yapılandırılabilir:

  • car_ui_focus_area_history_cache_type :
    1. Önbellek devre dışı.
    2. Bir süre sonra önbelleğin süresi dolar (aşağıya bakın).
    3. Önbellek asla sona ermez.
  • car_ui_focus_area_history_expiration_period_ms : kaç milisaniye önbellek türü 2'ye ayarlanırsa önbellek süresi dolmadan önce (yukarıya bakınız).
  • car_ui_clear_focus_area_history_when_rotating : Kullanıcı denetleyicisi döndüğünde olsun önbelleği geçersiz etmek.

döndürme

(Android 11 QPR3, Android 11 Araba, Android 12)
Oem iki tamsayı bilgi geçersiz kılabilir RotaryService ivme dönmesi için, fare hızlanma gibi olup olmadığını belirlemek için:

  • rotation_acceleration_3x_ms : (milisaniye cinsinden) Zaman aralığı, Google dönme bir mandalı için kontrolör dönüşünü hızlandırmak konusunda karar vermek kullandı. Bu kilit ile önceki dönme mesafesi arasındaki aralık bu değerden küçükse, üç dönme hareketi olarak kabul edilecektir. 3× hızlandırmayı devre dışı bırakmak için bunu 2147483647 olarak ayarlayın.
  • rotation_acceleration_2x_ms : Benzer rotation_acceleration_3x_ms . 2× hızlanma için kullanılır. Bu set 2147483647 devre dışı 2 x ivme.

Hızlanma olarak dönme her biri kilide için ayrı zaman damgaları, varken en iyi şekilde çalışır gerekli VHAL tarafından. Bu mevcut değilse, RotaryService dönme mandallar eşit aralıklı varsayar.

/**
     * 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),

Odak vurgusu

OEM, Android çerçevesindeki varsayılan odak vurgusunu ve araç kullanıcı arabirimi kitaplığındaki çeşitli odak vurgulama kaynaklarını geçersiz kılabilir.

Varsayılan odak vurgusu

Android çerçeve niteliği yoluyla varsayılan bir odak vurgu sağlar selectableItemBackground . Gelen Theme.DeviceDefault , bu özellik anlamına gelir item_background.xml olarak Core . OEM bindirebilirsiniz item_background.xml varsayılan odak vurgulamak çekilebilir değiştirmek için.

Bu durumda çekilebilir, tipik olarak bir olmalıdır StateListDrawable içeren durumları farklı kombinasyonlarına dayanan bir arka plan olarak ayarlar, android:state_focused ve android:state_pressed . Kullanıcı bir görünüm odaklamak için döner kumandayı kullanan, zaman android:state_focused olacak true , ama android:state_pressed olacak false . Kullanıcı daha sonra döner kumanda üzerindeki Merkezi düğmeye basarsa, hem android:state_focused ve android:state_pressed olacak true kullanıcı düğmesi aşağı tutarken. Kullanıcı düğmeyi serbest bıraktığında, sadece android:state_focused kalacaktır true .

araba ui-kütüphane kullanımları türetilmiş bir tema Theme.DeviceDefault . Sonuç olarak, bu bindirme bu kitaplığı ve türetilmiş herhangi bir tema kullanan uygulamalar kullanan uygulamalar etkiler Theme.DeviceDefault . Bu gibi alakasız bir tema kullanan uygulamalar, etkilemez Theme.Material .

Araç kullanıcı arabirimi kitaplığında vurgulanan kaynaklara odaklanın

OEM kontrolü için çeşitli araç-ui-kütüphane kaynaklarını geçersiz nasıl odak vurgulamak (örneğin yuvarlak veya hap şeklindeki gibi) ve elde edilmemiş ise bir tema kullanan uygulamalardaki olmayan bir dikdörtgen ile görünümlerde odak vurgulamak görünüyor Theme.DeviceDefault . Bu kaynaklar odak vurgulamak tutarlı olacak şekilde Kaplanmış olmalıdır varsayılan odak vurgulamak çekilebilir.

(Android 11 QPR3, Android 11 Araba, Android 12)
Aşağıdaki kaynaklar bir görünüm odaklanmış ancak basılı değilken belirtmek için kullanılır:

  • car_ui_rotary_focus_fill_color : Dolgu rengi.
  • car_ui_rotary_focus_stroke_color : Anahat rengi.
  • car_ui_rotary_focus_stroke_width : anahat kalınlığı.

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

  • car_ui_rotary_focus_pressed_fill_color : Dolgu rengi.
  • car_ui_rotary_focus_pressed_stroke_color : Anahat rengi.
  • car_ui_rotary_focus_pressed_stroke_width : anahat kalınlığı.

Bazen, gösterilen örnekte olduğu gibi, kullanıcının dikkatine sunmak için bir düğmeye düz bir arka plan rengi verilir. Bu, odak vurgusunun görülmesini zorlaştırabilir.

Düz arka plana sahip düğme
Düz bir arka plan Şekil 2. Düğme

Bu durumda, özel bir odak belirtebilirsiniz geliştirici ikincil renkler kullanarak vurgulamak:
  • (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 saydam olabilir ve örneğin yalnızca bir dolgu veya yalnızca bir anahat istiyorsanız, boyutlardan herhangi biri sıfır olabilir.

FocusArea vurgusu

(Android 11 QPR3, Android 11 Araba, Android 12)
FocusArea onun soyundan biri odaklandığında vurgulamak iki tür çizebilirsiniz. İstenirse ikisi birlikte kullanılabilir. Bu özellik AOSP'de varsayılan olarak devre dışıdır, ancak araç kullanıcı arabirimi kitaplığı kaynakları geçersiz kılınarak etkinleştirilebilir:

  • car_ui_enable_focus_area_foreground_highlight : üstüne bir vurguyu çizin FocusArea ve onun soyundan. AOSP, bu çekilebilir etrafında bir taslağıdır FocusArea . OEM geçersiz kılabilir car_ui_focus_area_foreground_highlight çekilebilir.
  • car_ui_enable_focus_area_background_highlight : üstüne bir vurgu çizin FocusArea ama onun soyundan arkasında. AOSP'de bu çizilebilirlik katı bir dolgudur. OEM geçersiz kılabilir car_ui_focus_area_background_highlight çekilebilir.

Giriş Yöntemi Düzenleyicileri

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

(Android 11 QPR3, Android 11 Araba, Android 12)
OEM bindirmek gerekir default_touch_input_method dize kaynağı RotaryService belirtmek için ComponentName dokunmatik tabanlı IME. OEM Android Otomotiv ile sağlanan IME kullanıyorsa Örneğin, onlar belirtmelidir com.google.android.apps.automotive.inputmethod/.InputMethodService .

(Android 11 QPR3, Android 11 Araba, Android 12)
OEM döner için özel bir IME yarattı, bunlar onun belirtmelidir ComponentName içinde rotary_input_method kaynak. Bu kaynak üst üste bindirilirse, kullanıcı döner kontrolörün dürtme, döndürme ve Merkez düğmesi aracılığıyla ana ünite ile etkileşim kurduğunda belirtilen IME kullanılır. Kullanıcı ekrana dokunduğunda önceki IME kullanılacaktır. Geri düğmesinin (ve döner kumanda üzerindeki diğer düğmelerin) IME seçimi üzerinde hiçbir etkisi yoktur. Bu kaynak kaplanmamışsa, IME geçişi gerçekleşmez. Carboard döndürmeyi desteklemez, bu nedenle OEM döner bir IME sağlamamışsa kullanıcı döner denetleyici aracılığıyla metin giremez.

RotaryIME demo döner IME olduğunu. Temel olmakla birlikte, yukarıda açıklanan otomatik IME değiştirmeyi denemek yeterlidir. İçin kaynak kodu RotaryIME bulunabilir packages/apps/Car/tests/RotaryIME/ .

Ekran dışı dürtmeler

Varsayılan olarak, kullanıcı ekranın kenarını dürtmeye çalıştığında hiçbir şey olmuyor. OEM, aşağıdakilerin herhangi bir kombinasyonunu belirterek dört yönün her biri için ne olması gerektiğini yapılandırabilir:

  1. Tarafından tanımlanan bir küresel eylem AccessibilityService . Örneğin, GLOBAL_ACTION_BACK .
  2. Gibi bir anahtar kodu KEYCODE_BACK .
  3. URL olarak temsil edilen bir etkinliği başlatma niyeti.

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

  • off_screen_nudge_global_actions : Kullanıcı aşağı, sola veya sağa ekranın kenarına kapalı, yukarıya sürüklenir zaman küresel eylemlerin Dizi gerçekleştirmek için. Bu dizinin ilgili elemanı -1 ise global bir işlem yapılmaz.
  • off_screen_nudge_key_codes : Kullanıcı aşağı, sola veya sağa ekranın kenarına kapalı, yukarıya sürüklenir zaman tıklama olaylarının kilit kodlarının Dizi enjekte etmek. Bu dizinin ilgili eleman 0 (eğer etkinlik yok enjekte edilir KEYCODE_UNKNOWN ).
  • off_screen_nudge_intents : Kullanıcı aşağı yukarıya sürüklenir zaman bir etkinlik başlatmak için niyet dizisi, sola veya sağa ekranın kenarına kapalı. Bu dizinin ilgili elemanı boşsa hiçbir aktivite başlatılmaz.

Diğer konfigürasyonlar

Aşağıdaki bindirmek gerekir RotaryService kaynaklarını:

  • (Android 11 QPR3, Android 11 Araba, Android 12)
    config_showHeadsUpNotificationOnBottom : Boolean değeri en karşı teke bildirimleri altında gösterilecektir olup olmadığını göstermek için. Bu aynı değere sahip olmalıdır config_showHeadsUpNotificationOnBottom Boole kaynak frameworks/base/packages/CarSystemUI/res/values/config.xml
  • (Android 11 QPR3, Android 11 Araba, Android 12)
    notification_headsup_card_margin_horizontal : teke tek bildirim penceresi için Sol ve sağ kenar boşluğu. Bu aynı değere sahip olmalıdır notification_headsup_card_margin_horizontal içinde Dimen kaynak packages/apps/Car/Notification/res/values/dimens.xml
  • (Android 12)
    excluded_application_overlay_window_titles : pencereleri bindirme düşünülmemelidir pencerelerin başlıkları dizisi. Bu temsil uygulama pencerelerinin başlıkları içermelidir TaskViews veya TaskDisplayAreas . Varsayılan olarak, bu liste yalnızca "Haritalar" içerir.

Aşağıdaki bindirebilirsiniz RotaryService kaynak:

  • (Android 11 QPR3, Android 11 Araba, Android 12)
    long_press_ms : Tamsayı değeri Merkezi düğmesi uzun basın tetiklemek için basılı tutulmalıdır kaç milisaniye temsil etmek. Sıfır, sistem varsayılan uzun basma zaman aşımının kullanılması gerektiğini belirtir. Bu varsayılan değerdir.