React Native使用USB串口库遇PendingIntent FLAG错误求助
解决React Native USB串口库的PendingIntent权限错误
问题核心
你的错误源于Android 12(API 31)及以上版本强制要求创建PendingIntent时必须指定FLAG_IMMUTABLE或FLAG_MUTABLE。仅直接替换为FLAG_IMMUTABLE可能因版本兼容性问题,或是修改后未正确编译生效,导致错误持续存在。
正确修改方案
修改UsbSerialportForAndroidModule.java中的tryRequestPermission方法,添加版本判断以适配不同Android版本:
@ReactMethod public void tryRequestPermission(int deviceId, Promise promise) { UsbManager usbManager = (UsbManager) getCurrentActivity().getSystemService(Context.USB_SERVICE); UsbDevice device = findDevice(deviceId); if (device == null) { promise.reject(CODE_DEVICE_NOT_FOND, "device not found"); return; } if (usbManager.hasPermission(device)) { promise.resolve(1); return; } // 添加版本判断,适配Android 12+及以下版本 int pendingIntentFlags; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { pendingIntentFlags = PendingIntent.FLAG_IMMUTABLE; } else { pendingIntentFlags = 0; // 旧版本无需指定特殊FLAG } PendingIntent usbPermissionIntent = PendingIntent.getBroadcast( getCurrentActivity(), 0, new Intent(INTENT_ACTION_GRANT_USB), pendingIntentFlags ); usbManager.requestPermission(device, usbPermissionIntent); promise.resolve(0); }
确保修改生效的步骤
- 移除无关依赖:你添加的
androidx.work:work-runtime:2.7.1与当前问题无关,可从app/build.gradle中删除。 - 清理Android编译缓存:在项目的
android目录下执行:./gradlew clean - 重新编译运行项目:
npx react-native run-android
额外注意事项
- 确认项目的
compileSdkVersion和targetSdkVersion是否设置为31或更高(若为31+,必须严格遵守FLAG要求)。 - 若你是通过npm安装的库,直接修改
node_modules中的文件不会持久生效,建议fork该库并修改后使用自己的fork版本,或是用patch-package工具保存修改。
内容的提问来源于stack exchange,提问作者Penny Starling
相关产品推荐
相关产品推荐

