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

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);
}

确保修改生效的步骤

  1. 移除无关依赖:你添加的androidx.work:work-runtime:2.7.1与当前问题无关,可从app/build.gradle中删除。
  2. 清理Android编译缓存:在项目的android目录下执行:
    ./gradlew clean
    
  3. 重新编译运行项目:
    npx react-native run-android
    

额外注意事项

  • 确认项目的compileSdkVersion和targetSdkVersion是否设置为31或更高(若为31+,必须严格遵守FLAG要求)。
  • 若你是通过npm安装的库,直接修改node_modules中的文件不会持久生效,建议fork该库并修改后使用自己的fork版本,或是用patch-package工具保存修改。

内容的提问来源于stack exchange,提问作者Penny Starling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:05:23