在 Android 的帮助菜单中注册硬件键盘快捷键
Register hardware keyboard shortcuts in Android's help menu
Android支持外接硬件键盘输入,可以发送快捷键(如Ctrl+A),其中有一些方法可以让我的应用程序接受来自外部键盘的快捷方式(例如:Custom keyboard shortcuts)。
我在 Android 中看到这个键盘快捷键“帮助”屏幕(通过按 OS + / 激活)(见下图)
并注意到一些应用程序有一些键盘快捷键直接在系统中注册快捷键帮助屏幕(应用程序不提供这些屏幕,可以通过按OS + /).
到目前为止,我看到的具有此功能的应用程序是:
- 三星互联网
- 三星 One UI 主页
- Google Chrome
- 基于 Chromium 的浏览器(例如 Brave)
- Google 文档、表格、幻灯片
我找不到任何方法来以编程方式在我的应用程序中注册我的键盘快捷键,以便系统能够识别它们。我怎样才能在我的应用程序中实现它?
我知道iOS/iPadOS有这样的功能。
或许Android也有这样的功能吧?它似乎对应用程序开发人员和用户非常有用,不确定为什么 Android 开发人员文档中根本没有记录它。
谢谢。
此功能在 Android 开发者网站中没有记录,所以我不得不四处搜索。
由于它受 AOSP 支持,因此这不是 Google 的专有 method/function。您用户的设备不需要 root。
由于此功能在 Chromium-based 浏览器中可用,我决定检查 open-source Chromium Android 源代码(GitHub 上的镜像可在此处获得有人:https://github.com/kuoruan/Chromium-Android) 我发现了这个功能是如何实现的。
相关行在这里:
- https://github.com/kuoruan/Chromium-Android/blob/29ba2966ff145c9cb2492a971f9c03f879c5b9c9/app/src/main/java/org/chromium/chrome/browser/KeyboardShortcuts.java#L117
- https://github.com/kuoruan/Chromium-Android/blob/29ba2966ff145c9cb2492a971f9c03f879c5b9c9/app/src/main/java/org/chromium/chrome/browser/ChromeTabbedActivity.java#L2135
在任何Activity
中,你都可以覆盖方法onProvideKeyboardShortcuts
。
它提供了3个参数:data
、menu
和deviceId
,其中我们这里只需要data
.
方法签名如下:
fun onProvideKeyboardShortcuts(
data: MutableList<KeyboardShortcutGroup>?,
menu: Menu?,
deviceId: Int
)
这仅适用于 API 24(Android 牛轧糖)及以上。
data
是 KeyboardShortcutGroup
的可变列表,它是一组键盘快捷键。
因此,您可以拥有包含多个快捷方式的多个组,这对于为您的用户对快捷方式进行分组非常有用。
要注册您的快捷方式,
- 创建
KeyboardShortcutGroup
。这是将键盘快捷键存储和组合在一起所必需的。 class 接受一个 CharSequence
作为组名的参数,所以你必须使用 getString(R.string.your_resource)
作为字符串资源。
val keyboardShortcutGroup = KeyboardShortcutGroup(/* the name of your group here: */ "Test Group")
- 定义键盘快捷键。键盘快捷键是使用
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
)
根据测试,有效的修改键是:
- Ctrl
META_CTRL_ON
- Alt
META_ALT_ON
- 移位
META_SHIFT_ON
- Super/OS/Meta(参见 https://android.stackexchange.com/a/243218/307843)
META_META_ON
- 函数
META_FUNCTION_ON
- Left/Right 所有这些的密钥也可用(即
META_ALT_LEFT_ON
)
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
- 为此
KeyboardShortcutGroup
,使用 addItem
添加快捷方式。
keyboardShortcutGroup.addItem(shortcut /* <-- the shortcut created earlier */)
- 将您的
KeyboardShortcutGroup
添加到 data
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 快捷菜单中添加了一个列表。
Android支持外接硬件键盘输入,可以发送快捷键(如Ctrl+A),其中有一些方法可以让我的应用程序接受来自外部键盘的快捷方式(例如:Custom keyboard shortcuts)。
我在 Android 中看到这个键盘快捷键“帮助”屏幕(通过按 OS + / 激活)(见下图)
并注意到一些应用程序有一些键盘快捷键直接在系统中注册快捷键帮助屏幕(应用程序不提供这些屏幕,可以通过按OS + /).
到目前为止,我看到的具有此功能的应用程序是:
- 三星互联网
- 三星 One UI 主页
- Google Chrome
- 基于 Chromium 的浏览器(例如 Brave)
- Google 文档、表格、幻灯片
我找不到任何方法来以编程方式在我的应用程序中注册我的键盘快捷键,以便系统能够识别它们。我怎样才能在我的应用程序中实现它?
我知道iOS/iPadOS有这样的功能。
或许Android也有这样的功能吧?它似乎对应用程序开发人员和用户非常有用,不确定为什么 Android 开发人员文档中根本没有记录它。
谢谢。
此功能在 Android 开发者网站中没有记录,所以我不得不四处搜索。
由于它受 AOSP 支持,因此这不是 Google 的专有 method/function。您用户的设备不需要 root。
由于此功能在 Chromium-based 浏览器中可用,我决定检查 open-source Chromium Android 源代码(GitHub 上的镜像可在此处获得有人:https://github.com/kuoruan/Chromium-Android) 我发现了这个功能是如何实现的。
相关行在这里:
- https://github.com/kuoruan/Chromium-Android/blob/29ba2966ff145c9cb2492a971f9c03f879c5b9c9/app/src/main/java/org/chromium/chrome/browser/KeyboardShortcuts.java#L117
- https://github.com/kuoruan/Chromium-Android/blob/29ba2966ff145c9cb2492a971f9c03f879c5b9c9/app/src/main/java/org/chromium/chrome/browser/ChromeTabbedActivity.java#L2135
在任何Activity
中,你都可以覆盖方法onProvideKeyboardShortcuts
。
它提供了3个参数:data
、menu
和deviceId
,其中我们这里只需要data
.
方法签名如下:
fun onProvideKeyboardShortcuts(
data: MutableList<KeyboardShortcutGroup>?,
menu: Menu?,
deviceId: Int
)
这仅适用于 API 24(Android 牛轧糖)及以上。
data
是 KeyboardShortcutGroup
的可变列表,它是一组键盘快捷键。
因此,您可以拥有包含多个快捷方式的多个组,这对于为您的用户对快捷方式进行分组非常有用。
要注册您的快捷方式,
- 创建
KeyboardShortcutGroup
。这是将键盘快捷键存储和组合在一起所必需的。 class 接受一个CharSequence
作为组名的参数,所以你必须使用getString(R.string.your_resource)
作为字符串资源。
val keyboardShortcutGroup = KeyboardShortcutGroup(/* the name of your group here: */ "Test Group")
- 定义键盘快捷键。键盘快捷键是使用
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
)
根据测试,有效的修改键是:
- Ctrl
META_CTRL_ON
- Alt
META_ALT_ON
- 移位
META_SHIFT_ON
- Super/OS/Meta(参见 https://android.stackexchange.com/a/243218/307843)
META_META_ON
- 函数
META_FUNCTION_ON
- Left/Right 所有这些的密钥也可用(即
META_ALT_LEFT_ON
)
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
- 为此
KeyboardShortcutGroup
,使用addItem
添加快捷方式。
keyboardShortcutGroup.addItem(shortcut /* <-- the shortcut created earlier */)
- 将您的
KeyboardShortcutGroup
添加到data
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 快捷菜单中添加了一个列表。