把安卓手机变成蓝牙键盘:四套布局(手机全屏 / 电脑全键盘 / 双手分体 / 游戏方向键),经蓝牙 HID 直连 iPad 等主机直接打字。 支持文字转发(边打边发):在键盘页的文本框里用你自己的输入法打字,字符边打边发到主机。 也可作为输入法使用(手机负责录入,按键流发给主机)。无需 root。
Turn your Android phone into a Bluetooth HID keyboard — four layouts (phone, desktop 60%, split two-thumb, and a game pad), plus on-the-fly text forwarding and an input-method mode that forwards typed text to the host. No root required.
已在真机上跑通"注册为键盘 → 连接主机 → 敲字上屏"的完整链路,并逐项验证过按键手感:
| 已实现 | 说明 |
|---|---|
| 蓝牙键盘 | 手机注册为 HID 键盘(BluetoothHidDevice),与主机配对后直接输入 |
| 全屏键盘 | 隐藏系统栏,键盘占满整屏;顶部一条细状态条 + 按需展开的面板;退出全屏按钮常驻可见,系统栏也可下滑临时呼出 |
| 4 套布局 | 手机全屏(12 格宽,竖屏 30dp 键;26 字母 + 数字行 + - ' , . / + 方向键)· 电脑全键盘(60%,15 格宽:Esc/` 列、完整标点、四向方向键)· 双手分体(13 格宽:中间留 1 格空隙、左右各 6 格、两个空格条)· 游戏方向键(12 格 × 4 行:左手 WASD/QERF + 空格,右手标准「↑ / ←↓→」方向簇;不能打字,选择器里已写明)。选择会被记住;从未选择过时:竖屏(窄窗口)默认手机全屏,横屏(宽窗口)默认电脑全键盘 |
| 文字转发(边打边发) | 键盘页有一个文本框,用你自己的输入法打字(应用不替换你的输入法),字符边打边发到已连接主机;每次编辑会被判定为追加 / 退格 / 无法复现三类,主机只收到新增字符而不是整行重发;光标跳到无法复现的位置时会重新锚定并明说,而不是发出错误的按键;「边打边发」开关可随时开启或关闭 |
| 输入法模式 | 可在系统输入法列表里选「键铸输入法」:手机自身的编辑/联想保持可用,输出发给主机。这是次要路径,只为让手机自己的编辑与候选保持可用;上面的文字转发不需要它(那个用的是你平时的输入法) |
| 长按 = 按住 | 同真实键盘:按住一个键只发按下、不发抬起,字符重复由主机自己产生;抬起只发生在手指离开的那一刻(这样串流玩游戏时长按方向键是连续移动,不是一顿一顿) |
| 按键震动 | 按下按键时手机轻震一下(走系统的 VIRTUAL_KEY 触感通道,因此跟随系统的触感/触觉反馈设置);可在「键盘」设置里随时开关,默认开 |
| 按键音 | 按下按键响一声:系统允许「触摸提示音」时用系统那声(音色与手机其他按键一致),系统关掉时用应用自带的短促音(因此开关一定听得到);「键盘」设置里可随时开关,默认开 |
| 4 套配色 | 夜幕(默认)· 明亮 · 午夜蓝 · 樱花;只改键盘本身的颜色(键面、按下高亮、键盘底色),设置页仍跟随系统深色;选择会被记住。每套配色都由单测校验可读性(文字对比度 ≥ 4.5:1、键面与底色可分辨),并有一张数据驱动的预览图 |
| 「关于」 | 设置里一键查看:应用名、版本号(读自安装包,与 versionName 同一来源,不写死)、支持范围、实测主机(iPad ✅ / Windows 11 + MediaTek ❌ / 其他未实测)、已知限制(只能发扫描码)、许可证,以及 GitHub 仓库与查看最新版本两个链接 |
| 修饰键两种模式 | 默认同电脑键盘(按住生效、松手释放);可在设置里切成"点一下保持" |
| 前台服务 | 离开应用后键盘仍保持连接(有常驻通知,可直接断开/停止) |
尚未实现(后续方向):鼠标/媒体键/触摸板。
⚠️ 只能转 ASCII,文字转发也一样:HID 键盘只有按键扫描码,中文/emoji 没有扫描码。 用中文输入法打拼音,主机收到的是那些字母;发不出去的字符会逐字列出字符和原因, 不会假装成功,也不会被悄悄丢掉或变成错误的按键。
键盘能力来自 Android 的 BluetoothHidDevice(HID Device 角色,Android 9 / API 28+),
但能否真正用起来取决于主机侧的蓝牙栈。实测结果:
| 主机 | 结果 |
|---|---|
| iPad(iPadOS) | ✅ 可用(90 ms 内建立连接,持续在线,敲字正常上屏) |
| Windows 11 + MediaTek 蓝牙 | ❌ 不可用:主机的配对记录里始终没有 HID 服务,手机发起的连接约 16 秒后被主机断开 |
| 其他主机 | 未实测。仓库带一个探针 tools/bt-service-probe.ps1,可在 Windows 上检查"主机是否登记了本机的 HID 服务" |
⚠️ 另外部分厂商固件没有向应用开放 HID Device profile。仓库里的能力探针(应用内"能力探针"页面) 就是用来在目标机型上先确认这一点的:registerApp成功才谈得上后续。 在 OPPO K12 Plus / Android 16 上实测:支持。
- 非 ASCII 无法通过标准键盘协议送达:HID 键盘只传按键扫描码,中文、emoji 没有对应扫描码。 因此文字转发只转发可映射的 ASCII 按键——用中文输入法打拼音,到达主机的是那些字母; 中文要靠目标设备自己的输入法(如 iPad 已装拼音)才能上屏。
- 本项目不需要 root,也不会要求 root。
- 安装 APK,打开应用 → 「能力探针」会检查本机是否支持(不支持会直接说明原因)。
- 点「打开键盘」进入键盘页,用系统蓝牙与主机配对。
- 点「连接设备」选择主机 → 显示"已连接"后即可打字。
- 需要保持连接时直接切走应用即可(前台服务会维持会话;通知栏可断开或停止)。
- 设置里的「全屏键盘」打开后键盘占满整屏(顶部状态条有「退出全屏」);顶部状态条还有一个「文字转发」按钮,点它会唤起你自己的系统键盘,你的键盘升起期间应用会隐藏自己的屏幕键盘,免得挡住文本框。
- 先在键盘页连好主机。
- 打开「边打边发」开关。
- 在文本框里用你自己的输入法输入(应用不会替换你的输入法):字符边打边发,主机那边就开始上屏。
- 每次编辑会被判定为追加 / 退格 / 无法复现三类,因此主机只收到新增的字符,不会把整行重发一遍。
- 光标跳到应用无法复现的位置时,它会重新锚定并明确告知,而不是继续发出错误的按键。
- 系统设置 → 语言与输入法 → 启用「键铸输入法」,并切换为当前输入法 (或在任意输入框弹出的输入法切换器里选它)。
- 先在键盘页连好主机(输入法与键盘页共用同一个连接会话)。
- 在输入框里输入文本 → 点「发送」,按键流会发到主机。
- 中文/emoji 等无法发送的字符会逐字列出原因(HID 只有扫描码),其余字符照常发送。
⚠️ 「输入法模式」是一条次要路径,只为让手机自己的编辑与联想保持可用;上面的 文字转发不需要它——文字转发用的是你平时的输入法,不需要把键铸设成系统输入法。
| 组件 | 版本 |
|---|---|
| JDK | 17+(本机用 Microsoft OpenJDK 21) |
| Android SDK | compileSdk 36、build-tools 36.x;local.properties 里 sdk.dir 指向本机 SDK |
| Gradle | 8.13(wrapper 已随仓库提供) |
| 最低运行版本 | Android 13(API 33) |
$env:JAVA_HOME = "<你的 JDK 17+ 目录>"
.\gradlew.bat assembleDebug # 产物:app\build\outputs\apk\debug\app-debug.apk单元测试(纯逻辑:键码映射 / 报文 / 状态机 / 布局数据 / 文本转发):
.\gradlew.bat testDebugUnitTest
⚠️ 作者本机的 wrapper 发行包下载被本地代理的 TLS 解密阻断(见开发副本ERROR.mdE1), 可直接用已解包的 Gradle 构建:<GRADLE_USER_HOME>\wrapper\dists\gradle-8.13-bin\<hash>\gradle-8.13\bin\gradle.bat assembleDebug。
版本号单一来源:app/build.gradle.kts 的 versionName(当前 1.0.3 为开发中版本;
1.0.2、1.0.1 为已发布版本)。
打 tag / 发 Release 由维护者按需触发。
说明:目前的 release 构建用调试密钥签名(
tools/sign-apk.ps1), 面向自用/测试;正式发布前会换成正式 keystore。