Kluczowe pliki map postaci

Pliki map znaków kluczowych (pliki .kcm ) odpowiadają za mapowanie kombinacji kodów kluczy Androida z modyfikatorami na znaki Unicode.

Pliki układu klawiszy specyficzne dla urządzenia są wymagane dla wszystkich wewnętrznych (wbudowanych) urządzeń wejściowych wyposażonych w klawisze, choćby po to, aby poinformować system, że dane urządzenie jest przeznaczone wyłącznie do celów specjalnych (nie jest to pełna klawiatura).

Pliki układu klawiszy specyficzne dla urządzenia są opcjonalne w przypadku klawiatur zewnętrznych i często w ogóle nie są potrzebne. System zapewnia ogólną mapę znaków klawiszy, która jest odpowiednia dla wielu klawiatur zewnętrznych.

Jeśli nie jest dostępny żaden plik układu klawiszy specyficzny dla urządzenia, system wybierze zamiast tego plik domyślny.

Lokalizacja

Pliki map znaków kluczowych są lokalizowane według dostawcy USB, identyfikatora produktu (i opcjonalnie wersji) lub nazwy urządzenia wejściowego.

Poniższe ścieżki są sprawdzane w kolejności.

  • /odm/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
  • /vendor/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
  • /system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
  • /data/system/devices/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
  • /odm/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
  • /vendor/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
  • /system/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
  • /data/system/devices/keychars/Vendor_XXXX_Product_XXXX.kcm
  • /odm/usr/keychars/DEVICE_NAME.kcm
  • /vendor/usr/keychars/DEVICE_NAME.kcm
  • /system/usr/keychars/DEVICE_NAME.kcm
  • /data/system/devices/keychars/DEVICE_NAME.kcm
  • /odm/usr/keychars/Generic.kcm
  • /vendor/usr/keychars/Generic.kcm
  • /system/usr/keychars/Generic.kcm
  • /data/system/devices/keychars/Generic.kcm
  • /odm/usr/keychars/Virtual.kcm
  • /vendor/usr/keychars/Virtual.kcm
  • /system/usr/keychars/Virtual.kcm
  • /data/system/devices/keychars/Virtual.kcm

Podczas konstruowania ścieżki pliku zawierającej nazwę urządzenia wszystkie znaki nazwy urządzenia inne niż „0”-„9”, „a”-„z”, „A”-„Z”, „-” lub „_” są zastępowane przez „_”.

Ogólny plik mapy znaków klucza

System udostępnia specjalny, wbudowany plik mapy znaków klawiszy o nazwie Generic.kcm . Ta mapa kluczowych znaków jest przeznaczona do obsługi różnych standardowych klawiatur zewnętrznych.

Nie modyfikuj ogólnej mapy znaków!

Plik mapy znaków klucza wirtualnego

System udostępnia specjalny, wbudowany plik mapy znaków klawiszy o nazwie Virtual.kcm , który jest używany przez wirtualne klawiatury.

Wirtualne urządzenie klawiatury jest syntetycznym urządzeniem wejściowym, którego identyfikator wynosi -1 (patrz KeyCharacterMap.VIRTUAL_KEYBOARD ). Jest obecny na wszystkich urządzeniach z Androidem, począwszy od Androida Honeycomb 3.0. Celem urządzenia wirtualnej klawiatury jest zapewnienie znanego, wbudowanego urządzenia wejściowego, które może być używane do wstrzykiwania naciśnięć klawiszy do aplikacji przez edytor IME lub za pomocą oprzyrządowania testowego, nawet w przypadku urządzeń, które nie mają wbudowanych klawiatur.

Zakłada się, że klawiatura wirtualna ma pełny układ QWERTY, taki sam na wszystkich urządzeniach. Dzięki temu aplikacje mogą wstrzykiwać naciśnięcia klawiszy za pomocą wirtualnej klawiatury i zawsze uzyskiwać takie same wyniki.

Nie modyfikuj wirtualnej mapy znaków klawiszy!

Składnia

Plik mapy znaków klawiszy to zwykły plik tekstowy składający się z deklaracji typu klawiatury i zestawu deklaracji klawiszy.

Deklaracja typu klawiatury

Deklaracja typu klawiatury opisuje ogólne zachowanie klawiatury. Plik mapy znaków musi zawierać deklarację typu klawiatury. Dla przejrzystości często umieszcza się go na górze pliku.

type FULL

Rozpoznawane są następujące typy klawiatur:

  • NUMERIC : Klawiatura numeryczna (12 klawiszy).

    Klawiatura numeryczna obsługuje wprowadzanie tekstu metodą wielu dotknięć. W celu wygenerowania żądanej litery lub symbolu może być konieczne wielokrotne dotknięcie klawisza.

    Ten typ klawiatury jest zazwyczaj przeznaczony do pisania kciukiem.

    Odpowiada KeyCharacterMap.NUMERIC .

  • PREDICTIVE : Klawiatura ze wszystkimi literami, ale z więcej niż jedną literą na klawisz.

    Ten typ klawiatury jest zazwyczaj przeznaczony do pisania kciukiem.

    Odpowiada KeyCharacterMap.PREDICTIVE .

  • ALPHA : Klawiatura ze wszystkimi literami i może kilkoma cyframi.

    Klawiatura alfabetyczna obsługuje bezpośrednie wprowadzanie tekstu, ale może mieć skondensowany układ i małą obudowę. W przeciwieństwie do klawiatury FULL , niektóre symbole mogą być dostępne wyłącznie za pomocą specjalnych selektorów znaków na ekranie. Ponadto, aby poprawić szybkość i dokładność pisania, framework zapewnia specjalne udogodnienia dla klawiatur alfabetycznych, takie jak automatyczne wprowadzanie wielkich liter oraz przełączane/blokowane klawisze SHIFT i ALT.

    Ten typ klawiatury jest zazwyczaj przeznaczony do pisania kciukiem.

  • FULL : Pełna klawiatura przypominająca komputer PC.

    Pełna klawiatura zachowuje się jak klawiatura komputera PC. Dostęp do wszystkich symboli można uzyskać bezpośrednio, naciskając klawisze na klawiaturze, bez obsługi ekranowej lub afordancji, takich jak automatyczna kapitalizacja.

    Ten typ klawiatury jest zazwyczaj przeznaczony do pełnego pisania dwiema rękami.

  • SPECIAL_FUNCTION : Klawiatura używana wyłącznie do wykonywania funkcji sterowania systemem, a nie do pisania.

    Klawiatura ze specjalnymi funkcjami składa się wyłącznie z klawiszy niedrukowalnych, takich jak HOME i POWER, które w rzeczywistości nie są używane do pisania.

Obie mapy znaków klawiszy Generic.kcm i Virtual.kcm są klawiaturami FULL .

Kluczowe deklaracje

Każda deklaracja key składa się ze słowa kluczowego key, po którym następuje nazwa kodowa klucza Androida, otwarty nawias klamrowy, zestaw właściwości i zachowań oraz zamknięty nawias klamrowy.

key A {
    label:                              'A'
    base:                               'a'
    shift, capslock:                    'A'
    ctrl, alt, meta:                    none
}

Nieruchomości

Każda właściwość klucza ustanawia mapowanie klucza na zachowanie. Aby pliki map znaków kluczowych były bardziej zwarte, można przypisać kilka właściwości do tego samego zachowania, oddzielając je przecinkiem.

W powyższym przykładzie właściwości label przypisano zachowanie 'A' . Podobnie właściwościom ctrl , alt i meta przypisuje się jednocześnie zachowanie none .

Rozpoznawane są następujące właściwości:

  • label : Określa etykietę fizycznie wydrukowaną na klawiszu, jeśli składa się z jednego znaku. Jest to wartość zwracana przez metodę KeyCharacterMap.getDisplayLabel .

  • number : Określa zachowanie (znak, który należy wpisać), gdy aktywny jest widok tekstu numerycznego, na przykład gdy użytkownik wpisuje numer telefonu.

    Klawiatury kompaktowe często łączą wiele symboli w jeden klawisz, tak że ten sam klawisz może być użyty do wpisania '1' i 'a' lub '#' i 'q' . W przypadku tych kluczy należy ustawić właściwość number , aby wskazywała, który symbol należy wpisać w kontekście numerycznym, jeśli taki istnieje.

    Niektóre typowe symbole „numeryczne” to cyfry od '0' do '9' , '#' , '+' , '(' , ')' , ',' i '.' .

  • base : Określa zachowanie (znak, który powinien zostać wpisany), gdy nie zostaną naciśnięte żadne modyfikatory.

  • <modyfikator> lub <modyfikator1> + <modyfikator2> + ...: Określa zachowanie (znak, który należy wpisać), gdy klawisz zostanie naciśnięty, a wszystkie określone modyfikatory są aktywne.

    Na przykład właściwość modyfikatora shift określa zachowanie, które ma zastosowanie po naciśnięciu modyfikatora LEWY SHIFT lub PRAWY SHIFT.

    Podobnie właściwość modyfikatora rshift+ralt określa zachowanie, które ma zastosowanie po jednoczesnym naciśnięciu modyfikatorów PRAWY SHIFT i PRAWY ALT.

We właściwościach modyfikatora rozpoznawane są następujące modyfikatory:

  • shift : Stosuje się po naciśnięciu modyfikatora LEWY SHIFT lub PRAWY SHIFT.
  • lshift : Stosuje się po naciśnięciu lewego klawisza SHIFT.
  • rshift : Stosuje się po naciśnięciu modyfikatora PRAWY SHIFT.
  • alt : Stosuje się po naciśnięciu modyfikatora LEWY ALT lub PRAWY ALT.
  • lalt : Stosuje się po naciśnięciu lewego modyfikatora ALT.
  • ralt : Stosuje się po naciśnięciu PRAWEGO modyfikatora ALT.
  • ctrl : Ma zastosowanie po naciśnięciu modyfikatora LEWY STEROWANIE lub PRAWY STEROWANIE.
  • lctrl : Stosuje się po naciśnięciu modyfikatora LEWY STEROWANIE.
  • rctrl : Stosuje się po naciśnięciu modyfikatora PRAWY STEROWANIE.
  • meta : Stosuje się po naciśnięciu modyfikatora LEWA META lub PRAWA META.
  • lmeta : Stosuje się po naciśnięciu LEWEGO modyfikatora META.
  • rmeta : Stosuje się po naciśnięciu PRAWEGO modyfikatora META.
  • sym : Stosuje się po naciśnięciu modyfikatora SYMBOL.
  • fn : Stosuje się po naciśnięciu modyfikatora FUNKCJA.
  • capslock : ma zastosowanie, gdy modyfikator CAPS LOCK jest zablokowany.
  • numlock : Stosuje się, gdy modyfikator NUM LOCK jest zablokowany.
  • scrolllock : Stosuje się, gdy modyfikator SCROLL LOCK jest zablokowany.

Kolejność, w jakiej wymienione są nieruchomości, ma znaczenie. Podczas mapowania klucza do zachowania system skanuje po kolei wszystkie istotne właściwości i zwraca ostatnie znalezione zachowanie.

W rezultacie właściwości określone później zastępują właściwości określone wcześniej dla danego klucza.

Zachowania

Każda właściwość jest mapowana na zachowanie. Najczęstszym zachowaniem jest wpisywanie znaku, ale są też inne.

Rozpoznawane są następujące zachowania:

  • none : nie wpisuj znaku.

    To zachowanie jest domyślne, gdy nie określono żadnego znaku. Określenie none jest opcjonalne, ale poprawia przejrzystość.

  • 'X' : wpisz określony literał znakowy.

    To zachowanie powoduje, że określony znak zostanie wprowadzony do aktywnego widoku tekstu. Literałem znakowym może być dowolny znak ASCII lub jedna z następujących sekwencji ucieczki:

    • '\\' : wpisz ukośnik odwrotny.
    • '\n' : Wpisz znak nowej linii (użyj tego dla ENTER/RETURN).
    • '\t' : wpisz znak TAB.
    • '\'' : wpisz znak apostrofu.
    • '\"' : wpisz znak cudzysłowu.
    • '\uXXXX' : wpisz znak Unicode, którego punkt kodowy jest podawany w formacie szesnastkowym przez XXXX.
  • fallback <nazwa kodowa klucza Androida>: Wykonaj domyślną akcję, jeśli klucz nie jest obsługiwany przez aplikację.

    To zachowanie powoduje, że system symuluje naciśnięcie innego klawisza, gdy aplikacja nie obsługuje natywnie określonego klawisza. Służy do obsługi domyślnego zachowania nowych klawiszy, z którymi nie wszystkie aplikacje potrafią sobie poradzić, takich jak ESCAPE lub klawisze klawiatury numerycznej (kiedy nie jest naciśnięty klawisz Numlock).

    Po wykonaniu działania awaryjnego aplikacja otrzyma dwa naciśnięcia klawiszy: jedno dla oryginalnego klawisza, a drugie dla wybranego klawisza zastępczego. Jeśli aplikacja obsłuży oryginalny klucz podczas kluczowania, zdarzenie klucza zastępczego zostanie anulowane ( KeyEvent.isCanceled zwróci true ).

System rezerwuje dwa znaki Unicode do wykonywania funkcji specjalnych:

  • '\uef00' : gdy wykonywane jest to zachowanie, widok tekstowy zużywa i usuwa cztery znaki poprzedzające kursor, interpretuje je jako cyfry szesnastkowe i wstawia odpowiedni punkt kodowy Unicode.

  • '\uef01' : Po wykonaniu tego zachowania w widoku tekstowym zostanie wyświetlone okno dialogowe wyboru znaków zawierające różne symbole.

System rozpoznaje następujące znaki Unicode jako kombinację znaków diakrytycznych martwych klawiszy:

  • '\u0300' : poważny akcent.
  • '\u0301' : Ostry akcent.
  • '\u0302' : Akcent okrągły.
  • '\u0303' : Akcent tyldy.
  • '\u0308' : Akcent umlautowy.

Kiedy zostanie wpisany martwy klawisz, po którym następuje inny znak, martwy klawisz i następujące po nim znaki zostaną utworzone. Na przykład, gdy użytkownik wpisze martwy klawisz z poważnym akcentem, po którym następuje litera „a”, wynikiem będzie „à”.

Więcej informacji na temat obsługi martwych kluczy można znaleźć w pliku KeyCharacterMap.getDeadChar .

Uwagi

Linie komentarza zaczynają się od „#” i trwają do końca linii. Lubię to:

# A comment!

Puste linie są ignorowane.

Jak kombinacje klawiszy są mapowane na zachowania

Kiedy użytkownik naciśnie klawisz, system sprawdza zachowanie powiązane z kombinacją naciśnięcia tego klawisza i aktualnie wciśniętych modyfikatorów.

SHIFT + A

Załóżmy, że użytkownik nacisnął jednocześnie A i SHIFT. System najpierw lokalizuje zestaw właściwości i zachowań powiązanych z KEYCODE_A .

key A {
    label:                              'A'
    base:                               'a'
    shift, capslock:                    'A'
    ctrl, alt, meta:                    none
}

System skanuje właściwości od pierwszej do ostatniej i od lewej do prawej, ignorując właściwości label i number , które są specjalne.

Pierwszą napotkaną właściwością jest base . Właściwość base zawsze ma zastosowanie do klawisza, niezależnie od naciśniętych modyfikatorów. Zasadniczo określa domyślne zachowanie klucza, chyba że zostanie ono zastąpione następującymi właściwościami. Ponieważ właściwość base dotyczy tego naciśnięcia klawisza, system odnotowuje fakt, że jego zachowanie to 'a' (wpisz znak a ).

Następnie system kontynuuje skanowanie kolejnych właściwości w przypadku, gdy którakolwiek z nich jest bardziej szczegółowa niż base i zastępuje ją. Natrafia na shift , które ma zastosowanie również do naciśnięcia klawisza SHIFT + A. Zatem system decyduje się zignorować zachowanie właściwości base i wybiera zachowanie powiązane z właściwością shift , czyli 'A' (wpisz znak A ).

Następnie kontynuuje skanowanie tabeli, jednakże żadne inne właściwości nie mają zastosowania do tego naciśnięcia klawisza (CAPS LOCK nie jest zablokowany, nie jest naciśnięty żaden klawisz STEROWANIA, nie jest naciśnięty klawisz ALT ani nie jest naciśnięty żaden klawisz META).

Zatem wynikowe zachowanie kombinacji klawiszy SHIFT + A to 'A' .

KONTROLA + A

Zastanówmy się teraz, co by się stało, gdyby użytkownik nacisnął jednocześnie A i STEROWANIE.

Tak jak poprzednio, system przeskanuje tabelę właściwości. Zauważy, że zastosowana została właściwość base , ale będzie także kontynuować skanowanie, aż w końcu osiągnie właściwość control . Tak się składa, że ​​właściwość control pojawia się po base , więc jej zachowanie zastępuje zachowanie base .

Zatem wynikowe zachowanie kombinacji klawiszy Control + A to none .

UCIECZKA

Załóżmy teraz, że użytkownik nacisnął ESCAPE.

key ESCAPE {
    base:                               fallback BACK
    alt, meta:                          fallback HOME
    ctrl:                               fallback MENU
}

Tym razem system uzyskuje zachowanie fallback BACK , zachowanie awaryjne. Ponieważ nie pojawia się żaden literał znakowy, żaden znak nie zostanie wpisany.

Podczas przetwarzania klucza system najpierw dostarczy do aplikacji KEYCODE_ESCAPE . Jeśli aplikacja tego nie obsłuży, system spróbuje ponownie, ale tym razem dostarczy do aplikacji KEYCODE_BACK zgodnie z żądaniem zachowania awaryjnego.

Zatem aplikacje rozpoznające i obsługujące KEYCODE_ESCAPE mają możliwość obsługi go w niezmienionej postaci, ale inne aplikacje, które tego nie robią, mogą zamiast tego wykonać akcję awaryjną, traktując klucz tak, jakby był to KEYCODE_BACK .

NUMPAD_0 z lub bez NUM LOCK

Klawisze klawiatury numerycznej mają bardzo różną interpretację w zależności od tego, czy klawisz NUM LOCK jest zablokowany.

Następująca deklaracja klucza zapewnia, że KEYCODE_NUMPAD_0 wpisuje 0 po naciśnięciu NUM LOCK. Gdy klawisz NUM LOCK nie zostanie naciśnięty, klawisz zostanie dostarczony do aplikacji w zwykły sposób, a jeśli nie zostanie obsłużony, zamiast niego zostanie dostarczony klawisz zastępczy KEYCODE_INSERT .

key NUMPAD_0 {
    label, number:                      '0'
    base:                               fallback INSERT
    numlock:                            '0'
    ctrl, alt, meta:                    none
}

Jak widzimy, deklaracje klawiszy zastępczych znacznie poprawiają kompatybilność ze starszymi aplikacjami, które nie rozpoznają lub bezpośrednio nie obsługują wszystkich klawiszy dostępnych na pełnej klawiaturze typu PC.

Przykłady

Pełna klawiatura

# This is an example of part of a key character map file for a full keyboard
# include a few fallback behaviors for special keys that few applications
# handle themselves.

type FULL

key C {
    label:                              'C'
    base:                               'c'
    shift, capslock:                    'C'
    alt:                                '\u00e7'
    shift+alt:                          '\u00c7'
    ctrl, meta:                         none
}

key SPACE {
    label:                              ' '
    base:                               ' '
    ctrl:                               none
    alt, meta:                          fallback SEARCH
}

key NUMPAD_9 {
    label, number:                      '9'
    base:                               fallback PAGE_UP
    numlock:                            '9'
    ctrl, alt, meta:                    none
}

Klawiatura alfanumeryczna

# This is an example of part of a key character map file for an alphanumeric
# thumb keyboard.  Some keys are combined, such as `A` and `2`.  Here we
# specify `number` labels to tell the system what to do when the user is
# typing a number into a dial pad.
#
# Also note the special character '\uef01' mapped to ALT+SPACE.
# Pressing this combination of keys invokes an on-screen character picker.

type ALPHA

key A {
    label:                              'A'
    number:                             '2'
    base:                               'a'
    shift, capslock:                    'A'
    alt:                                '#'
    shift+alt, capslock+alt:            none
}

key SPACE {
    label:                              ' '
    number:                             ' '
    base:                               ' '
    shift:                              ' '
    alt:                                '\uef01'
    shift+alt:                          '\uef01'
}

Kontroler

# This is an example of part of a key character map file for a game pad.
# It defines fallback actions that enable the user to navigate the user interface
# by pressing buttons.

type SPECIAL_FUNCTION

key BUTTON_A {
    base:                               fallback BACK
}

key BUTTON_X {
    base:                               fallback DPAD_CENTER
}

key BUTTON_START {
    base:                               fallback HOME
}

key BUTTON_SELECT {
    base:                               fallback MENU
}

Uwaga dotycząca kompatybilności

Przed wersją Android Honeycomb 3.0 mapa znaków kluczy systemu Android była określana przy użyciu zupełnie innej składni i była kompilowana do formatu pliku binarnego ( .kcm.bin ) w czasie kompilacji.

Chociaż nowy format wykorzystuje to samo rozszerzenie .kcm , składnia jest zupełnie inna (i znacznie potężniejsza).

Począwszy od wersji Android Honeycomb 3.0, wszystkie pliki map znaków klawiszy systemu Android muszą używać nowej składni i formatu zwykłego tekstu opisanego w tym dokumencie. Stara składnia nie jest obsługiwana, a stare pliki .kcm.bin nie są rozpoznawane przez system.

Notatka językowa

Android nie obsługuje obecnie klawiatur wielojęzycznych. Co więcej, wbudowana ogólna mapa znaków klawiszy zakłada układ klawiatury w języku angielskim (USA).

Zachęcamy producentów OEM do dostarczania niestandardowych map znaków klawiszy dla swoich klawiatur, jeśli są one przeznaczone dla innych języków.

Przyszłe wersje Androida mogą zapewniać lepszą obsługę wielojęzycznych klawiatur lub układów klawiatury wybieranych przez użytkownika.

Walidacja

Upewnij się, że sprawdziłeś pliki map kluczowych znaków za pomocą narzędzia Sprawdź mapy klawiszy .