在 Android 的帮助菜单中注册硬件键盘快捷键

LCZ*_*LCZ 1 android keyboard-shortcuts menu android-hardware-keyboard

Android 支持外部硬件键盘作为输入,这可能会发送键盘快捷键(例如Ctrl+ A),其中有一些方法可以对我的应用程序进行编程以接受来自外部键盘的快捷键(例如:自定义键盘快捷键)。

我在 Android 中遇到了这个键盘快捷键“帮助”屏幕(通过按 OS + / 激活)(见下图)

通用快捷方式帮助屏幕 应用程序特定键盘快捷键帮助屏幕

并注意到一些应用程序有一些键盘快捷键直接注册在系统快捷键帮助屏幕中(这些屏幕不是由应用程序提供的,可以通过按 OS + / 找到它们)。

到目前为止,我看到的具有此功能的应用程序是:

  • 三星互联网
  • 三星 One UI 主页
  • 谷歌浏览器
  • 基于 Chromium 的浏览器(例如 Brave)
  • Google 文档、表格、幻灯片

我找不到任何方法以编程方式在我的应用程序中注册键盘快捷键,以便系统识别它们。我怎样才能在我的应用程序中实现它?

我知道 iOS/iPadOS 有这样的功能。

也许Android也有这样的功能?它似乎对应用程序开发人员和用户非常有用,不知道为什么 Android 开发人员文档中根本没有记录它。

谢谢。

LCZ*_*LCZ 5

Android 开发者网站中没有记录此功能,因此我不得不到处搜索。

由于它受 AOSP 支持,因此这不是 Google 的专有方法/功能。您的用户设备不需要 root。

由于基于 Chromium 的浏览器可以使用此功能,因此我决定查看开源 Chromium Android 源代码(有人可以在 GitHub 上找到一个镜像: https: //github.com/kuoruan/Chromium-Android)并我已经发现了这个功能是如何实现的。

相关行在这里:

在任何情况下Activity,您都可以重写该方法onProvideKeyboardShortcuts
它提供了 3 个参数:datamenu、 和deviceId,其中我们只需要data这里。

这是方法签名:

fun onProvideKeyboardShortcuts(
        data: MutableList<KeyboardShortcutGroup>?,
        menu: Menu?,
        deviceId: Int
    )
Run Code Online (Sandbox Code Playgroud)

这只适用于 API 24 (Android Nougat) 及更高版本。

data是 的可变列表KeyboardShortcutGroup,它是一组键盘快捷键。

因此,您可以拥有多个包含多个快捷方式的组,这对于对用户的快捷方式进行分组非常有用。

要注册您的快捷方式,

  1. 创建一个KeyboardShortcutGroup。这是将键盘快捷键存储和分组所必需的。该类接受 aCharSequence作为组名称的参数,因此您必须使用getString(R.string.your_resource)字符串资源。
val keyboardShortcutGroup = KeyboardShortcutGroup(/* the name of your group here: */ "Test Group")
Run Code Online (Sandbox Code Playgroud)
  1. 定义您的键盘快捷键。键盘快捷键是使用KeyboardShortcutInfo对象定义的,该对象在其构造函数中接受 3 个参数 - 标签、键(例如 A/ Z/ 8/ 9)和修饰键。

    单个键盘快捷键是这样创建的:
KeyboardShortcutInfo("Shortcut One" /*label*/, KeyEvent.KEYCODE_Z/*key*/, KeyEvent.META_ALT_ON/*modifier*/)
Run Code Online (Sandbox Code Playgroud)

您需要将键代码传递到键和修饰键的构造函数中。
键和修饰键必须单独传入。

以下是可用键代码的列表: https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_0(请参阅那些带有前缀的键代码KEYCODE

根据测试,有效的修饰键是:

META_SYM_ON可能有效(尚未测试),但大写锁定不起作用。

要组合修饰键,
在 Java 中,使用按位运算符: KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_CTRL_ON
在 Kotlin 中,使用or运算符: KeyEvent.META_ALT_LEFT_ON or KeyEvent.META_CTRL_ON

  1. 为此KeyboardShortcutGroup,使用添加快捷方式addItem
keyboardShortcutGroup.addItem(shortcut /* <-- the shortcut created earlier */)
Run Code Online (Sandbox Code Playgroud)
  1. 将您添加KeyboardShortcutGroupdata
data.add(keyboardShortcutGroup)
Run Code Online (Sandbox Code Playgroud)

您的代码应如下所示:

    override fun onProvideKeyboardShortcuts(
        data: MutableList<KeyboardShortcutGroup>?,
        menu: Menu?,
        deviceId: Int
    ) {
        super.onProvideKeyboardShortcuts(data, menu, deviceId)

        // Requires API 24
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

            val keyboardShortcutGroup = KeyboardShortcutGroup("Test Group")
            keyboardShortcutGroup.addItem(KeyboardShortcutInfo("Shortcut One", KeyEvent.KEYCODE_Z, KeyEvent.META_ALT_ON))
            data?.add(keyboardShortcutGroup)
        }
    }
Run Code Online (Sandbox Code Playgroud)

您应该看到最终结果: 菜单截图

您可以使用它来通知用户可用的快捷方式。请注意,这并没有实现它们,它只是向 Android 快捷菜单添加了一个列表。