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
相关产品推荐
相关产品推荐

