ADBKeyBoard:通过ADB实现Android虚拟键盘输入

ADBKeyBoard:通过ADB实现Android虚拟键盘输入

项目描述

ADBKeyBoard 是一个创新的Android虚拟键盘输入法。它通过接收系统广播意图(Broadcast Intents)来执行输入命令,使得用户能够使用ADB(Android Debug Bridge)直接向Android设备发送文本输入。该项目主要解决了标准ADB input 命令无法输入Unicode字符(如中文、表情符号等)的问题,是自动化测试、设备批量操作和特殊字符输入场景的理想工具。

功能特性

  • ADB驱动的文本输入:通过ADB命令直接发送任意文本到当前激活的输入框。
  • 完整的Unicode字符支持 :突破了原生adb shell input text命令的限制,可以输入包括中文、日文、韩文及Emoji在内的所有Unicode字符。
  • 多种输入模式
    • 直接文本输入 (ADB_INPUT_TEXT)。
    • Base64编码文本输入 (ADB_INPUT_B64),用于解决高版本Android系统的兼容性问题。
    • 发送键位事件码 (ADB_INPUT_CODE),模拟物理按键(如删除、回车)。
    • 发送编辑器动作 (ADB_EDITOR_CODE),如执行搜索、前往等动作。
    • 发送Unicode字符码点 (ADB_INPUT_CHARS)。
    • 发送组合键(Meta键) (ADB_INPUT_MCODE),如Ctrl+A。
    • 清空文本 (ADB_CLEAR_TEXT)。
  • 便捷的ADB控制:提供完整的ADB命令来启用、切换和重置输入法。
  • 轻量级与易集成:APK体积小,通过广播机制与系统交互,无需复杂的权限或后台服务。

安装指南

方法一:直接安装APK(推荐)

  1. 从项目的Release页面下载最新的 ADBKeyboard.apk 文件。

  2. 连接Android设备并开启USB调试模式。

  3. 执行以下命令进行安装:

    bash 复制代码
    adb install ADBKeyboard.apk

方法二:从源码构建

  1. 克隆仓库 :

    bash 复制代码
    git clone https://github.com/senzhk/ADBKeyBoard.git
    cd ADBKeyBoard
  2. 配置环境 :

    • 设置 ANDROID_HOME 环境变量指向你的Android SDK路径,例如:

      bash 复制代码
      export ANDROID_HOME=$HOME/Android/Sdk
    • 或者直接编辑项目根目录下的 local.properties 文件,添加 sdk.dir=/path/to/your/Android/Sdk

  3. 构建并安装 :

    bash 复制代码
    ./gradlew installDebug

启用键盘

安装后,需要通过ADB或系统设置启用并切换到此输入法。

通过ADB启用和切换

bash 复制代码
# 启用ADBKeyBoard输入法
adb shell ime enable com.android.adbkeyboard/.AdbIME
# 将ADBKeyBoard设置为当前默认输入法
adb shell ime set com.android.adbkeyboard/.AdbIME

通过系统设置启用 : 进入设备的 设置 -> 系统 -> 语言和输入法 -> 虚拟键盘,找到并启用"ADBKeyBoard"。

使用说明

启用ADBKeyBoard后,即可通过发送广播意图(Broadcast Intents)来控制输入。

基础使用示例

  1. 发送普通文本 (可能在高版本Android上失效):

    bash 复制代码
    adb shell am broadcast -a ADB_INPUT_TEXT --es msg '你好嗎? Hello?'
  2. 发送Base64编码的文本 (推荐,兼容性更好):

    bash 复制代码
    # Mac/Linux
    adb shell am broadcast -a ADB_INPUT_B64 --es msg `echo -n '你好嗎? Hello?' | base64`
    # Windows (需借助PowerShell或Python脚本处理Base64)
  3. 发送按键事件 (如删除键,码值67):

    bash 复制代码
    adb shell am broadcast -a ADB_INPUT_CODE --ei code 67
  4. 发送编辑器动作 (如"前往"动作,码值2):

    bash 复制代码
    adb shell am broadcast -a ADB_EDITOR_CODE --ei code 2
  5. 发送Unicode字符码点 (发送"😸 Cat"):

    bash 复制代码
    adb shell am broadcast -a ADB_INPUT_CHARS --eia chars '128568,32,67,97,116'
  6. 发送组合键 (如Ctrl + A):

    bash 复制代码
    adb shell am broadcast -a ADB_INPUT_MCODE --es mcode '4096,29'
  7. 清空当前输入框的所有文本:

    bash 复制代码
    adb shell am broadcast -a ADB_CLEAR_TEXT

ADB输入法管理命令

  • 列出所有可用输入法 :

    bash 复制代码
    adb shell ime list -a
  • 切换回其他输入法 (例如Swype):

    bash 复制代码
    adb shell ime set com.nuance.swype.dtc/com.nuance.swype.input.IME
  • 重置为系统默认输入法 :

    bash 复制代码
    adb shell ime reset

核心代码

以下是项目核心类 AdbIME.java 的关键代码片段,展示了广播接收器的注册和消息处理逻辑。

java 复制代码
package com.android.adbkeyboard;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.inputmethodservice.InputMethodService;
import android.util.Base64;
import android.util.Log;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;

public class AdbIME extends InputMethodService {
    // 定义广播Action常量,用于识别不同类型的输入指令
    private String IME_MESSAGE = "ADB_INPUT_TEXT";
    private String IME_CHARS = "ADB_INPUT_CHARS";
    private String IME_KEYCODE = "ADB_INPUT_CODE";
    private String IME_META_KEYCODE = "ADB_INPUT_MCODE";
    private String IME_EDITORCODE = "ADB_EDITOR_CODE";
    private String IME_MESSAGE_B64 = "ADB_INPUT_B64";
    private String IME_CLEAR_TEXT = "ADB_CLEAR_TEXT";
    private BroadcastReceiver mReceiver = null;

    @Override
    public View onCreateInputView() {
        // 加载一个简单的空视图作为输入法界面
        View mInputView = getLayoutInflater().inflate(R.layout.view, null);

        // 注册广播接收器,用于监听来自ADB的命令
        if (mReceiver == null) {
            IntentFilter filter = new IntentFilter(IME_MESSAGE);
            filter.addAction(IME_CHARS);
            filter.addAction(IME_KEYCODE);

            filter.addAction(IME_EDITORCODE);
            filter.addAction(IME_MESSAGE_B64);
            filter.addAction(IME_CLEAR_TEXT);
            mReceiver = new AdbReceiver();
            registerReceiver(mReceiver, filter);
        }
        return mInputView;
    }

    public void onDestroy() {
        // 服务销毁时,注销广播接收器以防止内存泄漏
        if (mReceiver != null)
            unregisterReceiver(mReceiver);
        super.onDestroy();
    }

    // 内部广播接收器类,负责处理接收到的各种输入命令
    class AdbReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 处理普通文本输入命令
            if (intent.getAction().equals(IME_MESSAGE)) {
                String msg = intent.getStringExtra("msg");
                if (msg != null) {
                    InputConnection ic = getCurrentInputConnection();
                    if (ic != null)
                        ic.commitText(msg, 1); // 将文本提交到当前输入连接
                }
                // 此处代码省略了处理元键(Meta Key)的部分逻辑
            }
            // 其他Action(如IME_CHARS, IME_KEYCODE等)的处理逻辑在此类中继续实现...
        }
    }
}

代码关键点解析:

  1. 继承 InputMethodServiceAdbIME 类是Android输入法服务的基础,使其成为一个合法的系统输入法。

  2. onCreateInputView 方法 :在创建输入法视图时,初始化并注册一个 BroadcastReceiver (AdbReceiver)。它监听所有预定义的广播动作。

  3. AdbReceiver 内部类 :核心逻辑所在。其 onReceive 方法根据 Intent 的 Action 类型,提取附加数据(如文本、键值码),并通过 getCurrentInputConnection() 获取当前焦点输入框的连接,最终将输入内容提交 (commitText) 或执行相应动作。

  4. 生命周期管理 :在 onDestroy 中注销广播接收器,这是Android开发中防止上下文泄漏的良好实践。

这段代码清晰地展示了ADBKeyBoard的工作原理:作为一个"无界面"的输入法,它主要依靠后台接收广播指令来工作,从而实现高度的自动化控制能力。

相关推荐
薛定谔的猫198211 分钟前
十七、用 GPT2 中文对联模型实现经典上联自动对下联:
人工智能·深度学习·gpt2·大模型 训练 调优
壮Sir不壮23 分钟前
2026年奇点:Clawdbot引爆个人AI代理
人工智能·ai·大模型·claude·clawdbot·moltbot·openclaw
PaperRed ai写作降重助手32 分钟前
高性价比 AI 论文写作软件推荐:2026 年预算友好型
人工智能·aigc·论文·写作·ai写作·智能降重
玉梅小洋36 分钟前
Claude Code 从入门到精通(七):Sub Agent 与 Skill 终极PK
人工智能·ai·大模型·ai编程·claude·ai工具
-嘟囔着拯救世界-1 小时前
【保姆级教程】Win11 下从零部署 Claude Code:本地环境配置 + VSCode 可视化界面全流程指南
人工智能·vscode·ai·编辑器·html5·ai编程·claude code
正见TrueView1 小时前
程一笑的价值选择:AI金玉其外,“收割”老人败絮其中
人工智能
Imm7771 小时前
中国知名的车膜品牌推荐几家
人工智能·python
风静如云1 小时前
Claude Code:进入dash模式
人工智能
TM1Club1 小时前
AI驱动的预测:新的竞争优势
大数据·人工智能·经验分享·金融·数据分析·自动化
陈天伟教授1 小时前
人工智能应用-机器听觉:15. 声纹识别的应用
人工智能·神经网络·机器学习·语音识别