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

Kivy开发的Android App插入Type-C耳机时崩溃问题求助

Type-C耳机插入/通话时Python+Kivy Android应用崩溃问题

问题概况

  • Python+Kivy开发的Android应用,插入Type-C耳机或通话过程中直接崩溃,断开耳机或结束通话后恢复正常
  • 应用通过Buildozer编译,已发布至Google Play开放抢先体验渠道
  • 在Pydroid 3中编译运行时无此崩溃问题

补充复现信息

  • 连接车载蓝牙或Galaxy Buds蓝牙耳机时无异常,仅Type-C耳机插入会触发崩溃
  • 已在三星Galaxy Fold 3、S23 Ultra(均搭载Android 13)设备上稳定复现

崩溃日志详情

Google Play Console捕获的核心崩溃点:org.libsdl.app.HIDDeviceUSB.getSerialNumber

完整栈追踪:

Exception java.lang.RuntimeException:
  at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args (LoadedApk.java:1928)
  at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run
  at android.os.Handler.handleCallback (Handler.java:942)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loopOnce (Looper.java:226)
  at android.os.Looper.loop (Looper.java:313)
  at android.app.ActivityThread.main (ActivityThread.java:8747)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1067)
Caused by java.lang.SecurityException:
  at android.os.Parcel.createExceptionOrNull (Parcel.java:3023)
  at android.os.Parcel.createException (Parcel.java:3007)
  at android.os.Parcel.readException (Parcel.java:2990)
  at android.os.Parcel.readException (Parcel.java:2932)
  at android.hardware.usb.IUsbSerialReader$Stub$Proxy.getSerial (IUsbSerialReader.java:126)
  at android.hardware.usb.UsbDevice.getSerialNumber (UsbDevice.java:157)
  at org.libsdl.app.HIDDeviceUSB.getSerialNumber (HIDDeviceUSB.java:54)
  at org.libsdl.app.HIDDeviceManager.connectHIDDeviceUSB (HIDDeviceManager.java:368)
  at org.libsdl.app.HIDDeviceManager.handleUsbDeviceAttached (HIDDeviceManager.java:332)
  at org.libsdl.app.HIDDeviceManager.access$000 (HIDDeviceManager.java:26)
  at org.libsdl.app.HIDDeviceManager$1.onReceive (HIDDeviceManager.java:69)
  at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args (LoadedApk.java:1918)
Caused by android.os.RemoteException: Remote stack trace:
  at com.android.server.usb.UsbUserPermissionManager.checkPermission (UsbUserPermissionManager.java:741)
  at com.android.server.usb.UsbSerialReader.getSerial (UsbSerialReader.java:98)
  at android.hardware.usb.IUsbSerialReader$Stub.onTransact (IUsbSerialReader.java:89)
  at android.os.Binder.execTransactInternal (Binder.java:1316)
  at android.os.Binder.execTransact (Binder.java:1280)

问题分析

从栈追踪可以明确,崩溃的根源是**SecurityException**:Type-C耳机被识别为USB HID设备,当设备连接时,SDL的HID设备管理器自动尝试读取设备序列号,但应用未获得对应的USB权限,导致权限异常触发崩溃。

解决方案

1. 添加USB权限声明

在Buildozer配置文件buildozer.spec中添加USB权限:

android.add_manifest_permissions = android.permission.USB_PERMISSION

配置后会自动在生成的AndroidManifest.xml中注入权限声明。

2. 主动请求USB权限

在应用启动时主动请求USB权限,避免后续设备连接时触发权限异常:

from kivy.utils import platform

if platform == 'android':
    from android.permissions import request_permissions, Permission
    # 启动时请求USB权限
    request_permissions([Permission.USB_PERMISSION])

3. 禁用SDL自动HID设备扫描(可选)

如果应用不需要支持HID设备(如游戏手柄等),可以直接禁用SDL的HID设备自动扫描功能,从根源避免该问题:

android.meta_data = SDL_DISABLE_HID_DEVICE=1

4. 更新SDL相关依赖

检查Buildozer配置中的SDK/NDK版本,尝试更新到最新稳定版,部分旧版本SDL可能存在权限处理逻辑缺陷:

android.sdk = 33
android.ndk = 25b
android.sdk_build_tools = 34.0.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:25:01