为什么我的安卓应用请求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

