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

为什么我的安卓应用请求USB权限连接Arduino时会崩溃?

排查建议

  • PendingIntent Flag兼容调整
    你当前创建PendingIntent使用的flag为0,虽然targetSdk为30,但部分Android 10定制ROM、以及更高版本系统兼容逻辑会要求PendingIntent显式指定可变性标识,未指定时会触发无应用层栈的底层崩溃。将PendingIntent创建代码修改为:

    PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
    

    如果后续需要修改Intent的内容,将FLAG_IMMUTABLE替换为FLAG_MUTABLE即可。

  • 检查USB权限广播是否注册
    调用usbManager.requestPermission前必须先动态注册对应ACTION_USB_PERMISSION的广播接收器,系统需要通过该接收器回传权限申请结果,未注册时系统找不到回调目标会直接杀死应用进程,不会生成应用层崩溃日志。参考注册代码:

    // 写在onCreate或权限申请前的逻辑中
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(usbPermissionReceiver, filter);
    

    需同步实现usbPermissionReceiver的接收逻辑,不能留空。

  • 修正遍历逻辑冗余问题
    你当前匹配到Arduino设备后没有终止循环,后续遍历其他设备时会进入else分支将device变量置空,即使当前调用requestPermission时未触发问题,后续使用device变量时也会出现空指针异常,匹配到设备后添加break语句退出循环即可。

  • 核对清单文件配置
    确认AndroidManifest.xml中已经添加USB Host功能声明:

    <uses-feature android:name="android.hardware.usb.host" android:required="true" />
    

    缺失该声明时,部分系统会直接拦截USB相关API调用,触发无日志崩溃。

  • 抓取全量系统日志定位问题
    应用层logcat抓不到报错时,可通过adb抓取系统全量日志,过滤USB相关系统标签即可看到底层错误原因,命令参考:

    adb logcat -s UsbManager UsbHostManager ActivityManager
    

内容的提问来源于stack exchange,提问作者William R. Ebenezer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:05