使用PendingIntent申请USB权限时遇FLAG_IMMUTABLE/FLAG_MUTABLE问题求助
解决USB权限请求PendingIntent的问题
问题核心是隐式Intent搭配IMMUTABLE标记时,系统无法正确将权限结果传递到你的广播接收器,同时Mutable隐式PendingIntent在高版本Android会触发警告甚至异常。解决方式是把Intent改为显式,同时使用IMMUTABLE标记。
步骤1:定义USB权限广播接收器
先确保你有一个用于接收权限结果的BroadcastReceiver,示例如下:
class UsbPermissionReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (ACTION_USB_PERMISSION == intent?.action) { synchronized(this) { val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { device?.let { // 权限已授予,处理USB设备逻辑 } } else { // 权限被拒绝,做对应处理 } } } } }
步骤2:创建显式PendingIntent
将原有的隐式Intent改为显式指定广播接收器类,同时使用PendingIntent.FLAG_IMMUTABLE(如需兼容Android 11及以下,可搭配FLAG_UPDATE_CURRENT):
// 构建显式Intent,指定你的广播接收器类 val permissionIntent = Intent(context, UsbPermissionReceiver::class.java).apply { action = ACTION_USB_PERMISSION // 建议用带包名的唯一字符串,比如"com.your.app.ACTION_USB_PERMISSION" putExtra(UsbManager.EXTRA_DEVICE, device) } // 创建合规的PendingIntent val pendingIntent = PendingIntent.getBroadcast( context, 0, permissionIntent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) // 发起权限请求 mManager?.requestPermission(device, pendingIntent)
额外注意事项
- 若静态注册广播接收器,需在
AndroidManifest.xml中声明:
<receiver android:name=".UsbPermissionReceiver" android:exported="true"> <intent-filter> <action android:name="com.your.app.ACTION_USB_PERMISSION" /> </intent-filter> </receiver>
ACTION_USB_PERMISSION需使用自定义的唯一字符串(带包名前缀),避免与其他应用冲突。- Android 12及以上强制要求PendingIntent要么为IMMUTABLE,要么Intent为显式,因此显式Intent+IMMUTABLE是合规且有效的方案。
内容的提问来源于stack exchange,提问作者kpwn Apps
相关产品推荐
相关产品推荐

