原生 ADB 的 input text 命令确实 不支持中文,因为它只能模拟 ASCII 字符的键盘事件。
要解决这个问题,目前业界最成熟、最常用的方案是安装一个特制的输入法(ADBKeyBoard),通过发送广播(Broadcast)的方式来传递中文字符。
以下是具体的解决方案步骤和 Python 代码修改:
方法一:使用 ADBKeyBoard(最推荐,稳健)
这是一个开源的极简 Android 输入法,它不显示键盘界面,而是接收 ADB 广播指令来直接输入文字。
1. 准备工作下载 APK:去 GitHub 下载 ADBKeyBoard.apk (或者直接搜索下载,文件很小约 50KB)。
GitHub 地址: senzhk/ADBKeyBoard
直接下载: 在项目页面的 bin 目录下下载 apk。
安装并设置:在电脑终端运行以下命令(假设你已经连接了手机):
# 1. 安装 APK adb install ADBKeyBoard.apk # 2. 将 ADBKeyBoard 设置为当前输入法 adb shell ime set com.android.adbkeyboard/.AdbIME
注意:调试完后,如果你想用手机打字,需要去手机设置里把输入法切换回原来的(如搜狗、Gboard)。
2. 核心原理安装好后,你就不能用 input text 了,而是用 am broadcast 发送意图。
普通命令:
adb shell am broadcast -a ADB_INPUT_TEXT --es msg '你好世界'
Base64 模式 (推荐):如果文本包含空格或特殊字符,直接传字符串容易报错,建议转成 Base64 传输。
adb shell am broadcast -a ADB_INPUT_B64 --es msg 'base64_encoded_string'3. 修改 Python 代码
在之前的 Python 代码中,替换 input_text 函数。
import base64
def input_text(text):
"""
输入文本(支持中文)
需要先安装 ADBKeyBoard 并设置为默认输入法
"""
print(f"Executing: Type text '{text}'")
# 方法 A: 简单广播 (如果文本不含特殊符号)
# execute_adb(f"shell am broadcast -a ADB_INPUT_TEXT --es msg '{text}'")
# 方法 B: Base64 广播 (更稳健,支持空格和特殊符号)
try:
# 1. 转为 Base64
b64_text = base64.b64encode(text.encode('utf-8')).decode('utf-8')
# 2. 发送 Base64 广播命令
# 注意:ADBKeyBoard 接收 Base64 的 Action 是 ADB_INPUT_B64
cmd = f"shell am broadcast -a ADB_INPUT_B64 --es msg '{b64_text}'"
execute_adb(cmd)
except Exception as e:
print(f"Typing error: {e}")
# 测试一下
# input_text("你好,Gemini!") 方法二:剪贴板粘贴法(无需安装 APK,但兼容性较差)
如果你的环境不允许安装 APK,可以使用“复制到剪贴板 -> 模拟粘贴动作”的逻辑。但这种方法在 Android 10+ 以后因为后台剪贴板权限限制,变得不太稳定。
逻辑如下:
利用 Python 库(如 pyperclip)或者 ADB 命令将文本写入手机剪贴板。
发送 KEYCODE_PASTE (代码 279)。
注意:原生 ADB 很难直接把中文写入手机剪贴板,通常还是需要借用第三方工具。但你可以尝试先点击输入框,然后利用以下逻辑(假设你能在电脑端控制剪贴板):
由于纯 ADB 很难直接写入中文剪贴板,不推荐这个方法用于自动化脚本,除非结合 airtest 或 appium 这样的大型库,它们内部其实也是用类似 ADBKeyBoard 的原理实现的。
自动化脚本的完整优化(集成 ADBKeyBoard)
为了防止你忘记切换输入法导致脚本失效,可以在 Python 脚本初始化时自动检查和切换。
把这段代码加到你的 run_agent 或初始化流程中:
def setup_keyboard():
"""检查并自动切换到 ADBKeyBoard"""
# 1. 检查是否安装
packages = execute_adb("shell pm list packages com.android.adbkeyboard")
if "com.android.adbkeyboard" not in packages:
print("警告: 未检测到 ADBKeyBoard,中文输入将失败!")
print("请先安装: https://github.com/senzhk/ADBKeyBoard")
return
# 2. 获取当前输入法
current_ime = execute_adb("shell settings get secure default_input_method")
target_ime = "com.android.adbkeyboard/.AdbIME"
# 3. 如果不是 ADBKeyBoard,则切换
if target_ime not in current_ime:
print("正在切换输入法为 ADBKeyBoard...")
execute_adb(f"shell ime set {target_ime}")
# 启用它(防止第一次未启用)
execute_adb(f"shell ime enable {target_ime}")
def restore_keyboard():
"""(可选) 脚本结束后恢复原来的输入法"""
# 这里填你常用的输入法包名,例如搜狗是 com.sohu.inputmethod.sogou/.SogouIME
# 你可以通过 `adb shell ime list -a` 查看手机里有哪些输入法
# execute_adb("shell ime set com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME") # Gboard示例
pass 总结
下载 ADBKeyBoard.apk。
安装并设为默认输入法 (ime set com.android.adbkeyboard/.AdbIME)。
修改 Python 代码,使用 base64 编码 + am broadcast -a ADB_INPUT_B64 的方式发送文本。
网友回复


