如何在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设备过滤规则:
- 在项目根目录创建
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>
- 在
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
相关产品推荐
相关产品推荐

