如何在Kivy中为pyserial配置Android串口访问权限?
解决Kivy Android应用USB串口权限问题的正确配置方案
一、Buildozer配置调整
首先修改你的buildozer.spec文件,添加必要的权限和系统声明:
- 添加权限
找到android.permissions配置项,补充USB相关权限:
android.permissions = USB_PERMISSION, ACCESS_NETWORK_STATE
- 声明USB Host功能
添加额外的Manifest条目,确保应用支持USB Host模式:
android.additional_manifest_entries = <uses-feature android:name="android.hardware.usb.host" android:required="true" />
- 添加依赖库
因为需要调用Android的USB API,添加pyjnius依赖,同时准备好usb-serial-for-android的Jar包(可从官方代码仓库获取),并配置:
requirements = python3,kivy,pyserial,pyjnius android.add_jars = path/to/usb-serial-for-android.jar
二、Python代码层处理权限与串口操作
直接访问/dev/tty*会因为系统组权限限制报错,建议通过Android官方的USB Host API结合usb-serial-for-android库来操作,避免权限问题。以下是简化的代码示例:
from jnius import autoclass, cast from kivy.utils import platform def init_usb_serial(): if platform != 'android': return # 初始化Android相关类 UsbManager = autoclass('android.hardware.usb.UsbManager') Context = autoclass('android.content.Context') PendingIntent = autoclass('android.app.PendingIntent') Intent = autoclass('android.content.Intent') SerialPort = autoclass('com.hoho.android.usbserial.driver.UsbSerialPort') UsbSerialProber = autoclass('com.hoho.android.usbserial.driver.UsbSerialProber') # 获取USB管理器实例 usb_manager = cast(UsbManager, Context.getSystemService(Context.USB_SERVICE)) # 枚举所有支持的串口设备 prober = UsbSerialProber.getDefaultProber() device_array = usb_manager.getDeviceList().values().toArray() target_port = None for device in device_array: driver = prober.probeDevice(device) if driver: target_port = driver.getPorts()[0] # 取第一个可用串口 break if not target_port: print("未找到可用的USB串口设备") return # 请求USB设备权限 permission_action = "com.your.app.USB_PERMISSION" permission_intent = Intent(permission_action) pending_intent = PendingIntent.getBroadcast(Context, 0, permission_intent, 0) if usb_manager.hasPermission(target_port.getDriver().getDevice()): # 权限已获取,打开串口 connection = usb_manager.openDevice(target_port.getDriver().getDevice()) if connection: target_port.open(connection) # 配置串口参数(根据你的设备调整) target_port.setParameters(9600, 8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE) # 读写示例 target_port.write(b"Hello from Kivy!") received_data = target_port.read(1024) print(f"收到数据: {received_data}") # 使用完毕关闭 target_port.close() else: # 发起权限请求,用户授权后会触发广播 usb_manager.requestPermission(target_port.getDriver().getDevice(), pending_intent)
三、关键注意事项
- 确保你的设备支持USB Host模式(部分低端设备可能不支持),并在开发者选项中开启USB调试。
usb-serial-for-android的Jar包版本要与你的Android API版本匹配,建议使用最新稳定版。- 权限请求是异步的,用户授权后需要通过广播接收器处理后续逻辑(如果需要持续操作串口)。
内容的提问来源于stack exchange,提问作者tosh_21
相关产品推荐
相关产品推荐

