在没有root的情况下自定义Android上外部键盘的布局

我喜欢Mac上的键盘布局:拇指下方的Cmd(Ctrl)键,并且可以在不设置萨满教义的情况下直接在设置中更改CapsLock的行为。在Linux中使用setxkbmap控制台或gnome-tweak-tool在UI中可以轻松获得相同的结果但是,如果键盘连接到Android怎么办?



在Android中,有几种自定义外部键盘的方法:


  1. 安装第三方键盘。例如,外部键盘帮助器
  2. / kl kcm ( root). , , .
  3. , .

. — . .



.


Key Layout


Key layout (.kl) (Linux Key Code), .. , , (Android  Key), .. TAB, ENTER F. - . , , , , Gamepad Tester.


Key Character Map


Key Character Map (.kcm) , , English(US).



4.1 Android . Settings -> Language & input -> Physical keyboard. , , " ".



:


  • Esc CapsLock.
  • Ctrl/Win/Alt Win/Alt/Ctrl Alt/PrintScreen/Ctrl Ctrl/Alt/Ctrl .
  • Alt+Tab Ctrl+Tab.
  • Ctrl+Shift+3.
  • Win+Space.
  • .


.. ( Ctrl CapsLock, Vim?), " ", apk-. custom-keyboard-layout — Android.



git clone git@github.com:ris58h/custom-keyboard-layout.git

app/src/main/AndroidManifest.xml:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ris58h.custom_keyboard_layout">

    <application android:label="@string/app_name">
        <receiver
            android:name=".InputDeviceReceiver"
            android:label="@string/keyboard_layouts_label">
            <intent-filter>
                <action android:name="android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS" />
            </intent-filter>
            <meta-data
                android:name="android.hardware.input.metadata.KEYBOARD_LAYOUTS"
                android:resource="@xml/keyboard_layouts" />
        </receiver>
    </application>
</manifest>

reciever. , ( InputDeviceReceiver) — , . reciever , app/src/main/res/xml/keyboard_layouts.xml:


<?xml version="1.0" encoding="utf-8"?>
<keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android">
    <keyboard-layout
        android:name="keyboard_layout_en_us"
        android:keyboardLayout="@raw/keyboard_layout_en_us"
        android:label="@string/keyboard_layout_en_us_label" />
</keyboard-layouts>

keyboard_layout_en_us.



app/src/main/res/raw/keyboard_layout_en_us.kcm , :


type OVERLAY

, , - Generic.kcm. .. — .


Key Layout . kcm-, , , Ctrl Alt kl-. : map kl- kcm-.


keyboard_layout_en_us.kcm :


type OVERLAY

map key 58  ESCAPE

map key 29  META_LEFT
map key 56  CTRL_LEFT
map key 125 ALT_LEFT

map key 99  ALT_RIGHT
map key 100 CTRL_RIGHT

key TAB {
    label:                              '\t'
    base:                               '\t'
    ctrl:                               fallback APP_SWITCH
}

key 3 {
    label:                              '3'
    base:                               '3'
    shift:                              '#'
    ctrl+shift:                         fallback SYSRQ
}

, Win+Space — .



, English(US), kcm- , . . keyboard_layout_russian.kcm, app/src/main/res/raw/ , , app/src/main/res/xml/keyboard_layouts.xml:


<?xml version="1.0" encoding="utf-8"?>
<keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android">
    <keyboard-layout
        android:name="keyboard_layout_en_us"
        android:keyboardLayout="@raw/keyboard_layout_en_us"
        android:label="@string/keyboard_layout_en_us_label" />
    <keyboard-layout
        android:name="keyboard_layout_ru"
        android:keyboardLayout="@raw/keyboard_layout_ru"
        android:label="@string/keyboard_layout_ru_label" />
</keyboard-layouts>

keyboard_layout_ru_label app/src/main/res/values/strings.xml.
, , . '3', , :


key 3 {
    label:                              '3'
    base:                               '3'
    shift:                              '\u2116'
    ralt:                               '#'
    ctrl+shift:                         fallback SYSRQ
}

Vendor_17ef_Product_6048.



我们收集并安装我们的应用程序。最简单的方法是按照官方文档使用Android Studio


如果一切都正确完成,那么Settings -> Language & input -> Physical keyboard我们的布局将显示在应用程序列表中- Custom Keyboard Layout


结论


无需root也可以自定义外部键盘。并非所有的愿望清单都是可以实现的:在Win + Space上切换语言不起作用,但这可能是固件问题。


本文特意简短-所有详细信息都可以在链接上找到。


All Articles