You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python结合ADB发送希伯来语WhatsApp消息报错求助

问题:ADB输入希伯来语到WhatsApp触发NullPointerException
  • 已实现Python结合ADB向WhatsApp发送英文消息正常,但发送希伯来语消息时触发错误
  • 测试确认安卓手机默认短信APP可正常发送希伯来语消息
  • 当前现象:希伯来语内容未被输入,程序直接跳转到下一个联系人

代码实现

import subprocess
import time


def run_adb_command(command):
    subprocess.run(command, shell=True, encoding='utf-8')


def open_whatsapp_with_message(code, number, message):
    url = f'https://api.whatsapp.com/send?phone={code}{number}'
    command = f'adb shell am start -a android.intent.action.VIEW -d "{url}"'
    run_adb_command(command)
    time.sleep(3)

    input_command = f'adb shell input text "{message}"'
    print(input_command)
    run_adb_command(input_command)
    time.sleep(1)

    keyevent_command = 'adb shell input keyevent'
    run_adb_command(f'{keyevent_command} 21')
    run_adb_command(f'{keyevent_command} 21')
    time.sleep(1)

    run_adb_command(f'{keyevent_command} 21')
    run_adb_command(f'{keyevent_command} 21')
    run_adb_command(f'{keyevent_command} 66')


def process_numbers(numbers):
    code = "+"
    message = "בדיקה"

    for number in numbers:
        open_whatsapp_with_message(code, number, message)
        time.sleep(5)  # Add a delay between each iteration


# Example usage
number_list = ["12345678", "87654321"]
process_numbers(number_list)

报错信息

java.lang.NullPointerException: Attempt to get length of null array
    at com.android.commands.input.Input$InputText.sendText(Input.java:168)
    at com.android.commands.input.Input$InputText.run(Input.java:140)
    at com.android.commands.input.Input.onRun(Input.java:107)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:60)
    at com.android.commands.input.Input.main(Input.java:71)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:409)

解决方案

方案1:将希伯来语文本转义为Unicode编码

ADB的input text命令对非ASCII字符的解析依赖Unicode转义格式,直接传入原始希伯来语会导致编码解析失败。修改消息转义逻辑:

# 替换原input_command生成代码
message_escaped = message.encode('unicode-escape').decode('utf-8').replace('"', '\\"')
input_command = f'adb shell input text "{message_escaped}"'

方案2:使用剪贴板粘贴(更稳定推荐)

剪贴板对Unicode文本支持更完善,避免input text的编码问题,步骤如下:

  1. 将消息写入安卓系统剪贴板
  2. 在WhatsApp输入框触发粘贴操作

修改open_whatsapp_with_message函数中的输入部分:

# 替换原input_command相关代码
keyevent_command = 'adb shell input keyevent'
# 设置剪贴板内容
clipboard_command = f'adb shell am broadcast -a android.intent.action.CLIPBOARD --es text "{message}"'
run_adb_command(clipboard_command)
time.sleep(0.5)
# 触发粘贴(Ctrl+V)
run_adb_command(f'{keyevent_command} 29')  # 按下左Ctrl
run_adb_command(f'{keyevent_command} 118') # 按下V
run_adb_command(f'{keyevent_command} 29')  # 释放左Ctrl
time.sleep(1)

原因说明:ADB底层的input text命令在处理RTL(从右到左)语言时存在编码解析缺陷,导致NullPointerException;剪贴板方式直接传递完整Unicode文本,兼容性和稳定性更好。

内容的提问来源于stack exchange,提问作者eitan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:00:17