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

如何在Kivy中为pyserial配置Android串口访问权限?

解决Kivy Android应用USB串口权限问题的正确配置方案

一、Buildozer配置调整

首先修改你的buildozer.spec文件,添加必要的权限和系统声明:

  1. 添加权限
    找到android.permissions配置项,补充USB相关权限:
android.permissions = USB_PERMISSION, ACCESS_NETWORK_STATE
  1. 声明USB Host功能
    添加额外的Manifest条目,确保应用支持USB Host模式:
android.additional_manifest_entries = <uses-feature android:name="android.hardware.usb.host" android:required="true" />
  1. 添加依赖库
    因为需要调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:17:20