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

如何在Android平台的Kivy应用中使用USB数字小键盘输入文本

解决Android上Kivy应用USB数字小键盘无响应的问题

我之前也碰到过类似的情况,USB外设输入在Kivy里没触发,别着急,咱们一步步来排查和解决:

1. 启用Kivy的HID输入支持

Kivy默认可能没完全捕获USB键盘的输入事件,你可以在主Python文件开头添加配置代码,强制开启HID设备的输入支持:

from kivy.config import Config
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
# 启用USB HID设备输入支持
Config.set('input', 'hidinput', 'hidinput')

USB数字小键盘属于HID设备,这段配置能让Kivy识别到它的输入信号

2. 修复文本输入框的焦点问题

有时候看起来文本框获得了焦点,但Kivy内部的焦点处理可能有异常。你可以自定义一个TextInput组件,确保焦点触发时输入事件能正确传递:

from kivy.uix.textinput import TextInput
from kivy.core.window import Window

class CustomTextInput(TextInput):
    def on_focus(self, instance, value):
        if value:
            # 强制让Window把输入事件导向当前文本框
            Window.focus = self

之后用这个CustomTextInput替换你原来的文本输入框即可。

3. 添加Android USB权限配置

Android系统需要额外权限才能让应用访问USB设备,你需要在buildozer.spec文件里添加相关配置:

# 添加USB权限
android.permissions = USB_PERMISSION
# 声明支持USB主机模式
android.add_manifest_entries = '''
<uses-feature android:name="android.hardware.usb.host" />
'''

如果是Android 10+的系统,还需要添加USB设备过滤规则:

  1. 在项目根目录创建res/xml/device_filter.xml文件,内容如下(替换成你的小键盘的厂商ID和产品ID,可通过USB调试工具或第三方APP查看):
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-device vendor-id="你的厂商ID" product-id="你的产品ID" />
</resources>
  1. 在buildozer.spec里关联这个过滤文件:
android.add_manifest_entries = '''
<uses-feature android:name="android.hardware.usb.host" />
<intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
    android:resource="@xml/device_filter" />
'''

4. 手动监听键盘事件作为备选方案

如果上面的方法都失效,你可以直接在Window级别捕获键盘输入,手动写入文本框:

from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.core.window import Window

class MyApp(App):
    def build(self):
        self.text_input = TextInput()
        # 绑定全局键盘按下事件
        Window.bind(on_key_down=self.handle_key_input)
        return self.text_input

    def handle_key_input(self, window, key, scancode, codepoint, modifiers):
        # 只处理数字输入
        if self.text_input.focus and codepoint in '0123456789':
            self.text_input.insert_text(codepoint)
            return True  # 阻止事件继续传递,避免重复处理
        return False

5. 确认Kivy版本

旧版本Kivy可能存在Android USB输入的bug,建议在buildozer.spec里指定最新稳定版:

requirements = python3,kivy==2.2.1

(可以根据实际情况替换为当前最新版本)

你可以先从第一步开始尝试,大多数情况下启用HID输入支持就能解决问题。如果还是不行,再逐步尝试后面的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:40