0

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

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

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

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

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

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

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

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

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

谢谢。

4

1 回答 1

0

Android Developer 网站中没有记录此功能,因此我不得不四处搜索。

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

由于此功能在基于 Chromium 的浏览器中可用,因此我决定查看开源 Chromium Android 源代码(某人在 GitHub 上提供了镜像:https ://github.com/kuoruan/Chromium-Android )和我发现了这个功能是如何实现的。

相关行在这里:

在任何Activity情况下,您都可以覆盖该方法onProvideKeyboardShortcuts
它提供了 3 个参数:datamenudeviceId,我们data这里只需要它们。

这是方法签名:

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

这仅适用于 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")
  1. 定义您的键盘快捷键。键盘快捷键是使用KeyboardShortcutInfo对象定义的,它在其构造函数中接受 3 个参数——标签、键(例如 A/Z/8/9)和修饰键。

    以这种方式创建单个键盘快捷键:
KeyboardShortcutInfo("Shortcut One" /*label*/, KeyEvent.KEYCODE_Z/*key*/, KeyEvent.META_ALT_ON/*modifier*/)

您需要将键代码传递给键和修饰键的构造函数。
键和修饰键必须分开传入。

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

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

META_SYM_ON可能有效(尚未测试),但 Caps Lock 无效。

要组合修饰键,
在 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 */)
  1. 添加KeyboardShortcutGroupdata
data.add(keyboardShortcutGroup)

您的代码应如下所示:

    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)
        }
    }

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

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

于 2022-02-10T09:33:53.873 回答