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

React Native安卓端RNPermissionsModule缺失及PERMISSIONS未定义问题求助

react-native-permissions v4.0.4 Android端RNPermissionsModule找不到问题

问题描述

开发申请权限后打开相机的React Native应用,使用react-native-permissions v4.0.4版本,安卓设备测试时出现以下错误:

  1. 'RNPermissionsModule' could not be found. Invariant Violation: TurboModuleRegistry.getEnforcing(...)
  2. 关联错误:[TypeError: Cannot read property 'PERMISSIONS' of undefined]

权限处理代码(Permissions.js)

import { Alert, Platform } from 'react-native';
import { check, PERMISSIONS, RESULTS, request, openSettings } from 'react-native-permissions';

export const isIOS = Platform.OS === 'ios';

function showAlert(msg) {
    Alert.alert('', msg, [
        {
            text: 'Cancel',
            onPress: () => console.log('Cancel Pressed'),
            style: 'cancel',
        },
        {
            text: 'Settings',
            onPress: () => {
                openSettings().catch(() => console.warn('cannot open settings'));
            },
        },
    ]);
}

const hasCameraPermission = async (withAlert = true) => {
    try {
        const permission = isIOS
            ? PERMISSIONS.IOS.CAMERA
            : PERMISSIONS.ANDROID.CAMERA;
        const response = await check(permission);
        let camera;
        if (response.camera !== RESULTS.GRANTED) {
            camera = await request(permission);
        }
        if (camera === RESULTS.DENIED || camera === RESULTS.BLOCKED) {
            if (withAlert) {
                showAlert(
                    'Permission not granted for Camera. Unable to use camera in this application.',
                );
            }
            return false;
        }
        return true;
    } catch (error) {
        console.log(error);
        return false;
    }
};

const hasPhotoPermission = async (withAlert = true) => {
    try {
        const permission = isIOS
            ? PERMISSIONS.IOS.PHOTO_LIBRARY
            : PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE_StorageService;
        const response = await check(permission);
        let photo;
        if (response.photo !== RESULTS.GRANTED) {
            photo = await request(permission);
        }
        if (photo === RESULTS.DENIED || photo === RESULTS.BLOCKED) {
            if (withAlert) {
                showAlert(
                    'Permission not granted for photos. Unable to get photos in this application.',
                );
            }
            return false;
        }
        return true;
    } catch (error) {
        console.log(error);
        return false;
    }
};

const PermissionsService = {
    hasCameraPermission,
    hasPhotoPermission,
}

export default PermissionsService;

已尝试的解决方法

  • 重新安装react-native-permissions
  • 降级react-native-permissions版本
  • 清理缓存
  • 通过NativeModules检查RNPermissionsModule注册状态,输出结果为RNPermissionsModule not found

解决方案

1. 确认React Native版本兼容性

react-native-permissions v4.0.4要求React Native版本≥0.64,执行以下命令检查RN版本:

npx react-native info

若版本低于要求,需升级RN或调整react-native-permissions版本至兼容你的RN版本。

2. 确保安卓端链接配置正确

检查自动链接状态

RN 0.60+默认支持自动链接,执行以下命令确保链接生效:

cd android && ./gradlew clean
cd .. && npx react-native run-android

手动验证配置文件

  • 打开android/settings.gradle,确认包含以下内容:
    include ':react-native-permissions'
    project(':react-native-permissions').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-permissions/android')
    
  • 打开android/app/build.gradle,确认dependencies中包含:
    implementation project(':react-native-permissions')
    
  • 若自动链接未生效,手动在MainApplication.java中注册模块:
    import com.zoontek.rnpermissions.RNPermissionsPackage;
    
    @Override
    protected List<ReactPackage> getPackages() {
        List<ReactPackage> packages = new PackageList(this).getPackages();
        packages.add(new RNPermissionsPackage());
        return packages;
    }
    

3. 修正权限处理代码中的逻辑错误

代码中存在两处关键错误,会导致权限判断失效甚至加剧模块加载问题:

错误1:权限常量拼写错误

安卓端存储权限应为PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,而非WRITE_EXTERNAL_STORAGE_StorageService。

错误2:check方法返回值判断错误

check()方法返回的是单个权限结果(如RESULTS.GRANTED),而非带属性的对象,因此response.camera/response.photo的写法错误。

修正后的代码:

import { Alert, Platform } from 'react-native';
import { check, PERMISSIONS, RESULTS, request, openSettings } from 'react-native-permissions';

export const isIOS = Platform.OS === 'ios';

function showAlert(msg) {
    Alert.alert('', msg, [
        {
            text: 'Cancel',
            onPress: () => console.log('Cancel Pressed'),
            style: 'cancel',
        },
        {
            text: 'Settings',
            onPress: () => {
                openSettings().catch(() => console.warn('cannot open settings'));
            },
        },
    ]);
}

const hasCameraPermission = async (withAlert = true) => {
    try {
        const permission = isIOS
            ? PERMISSIONS.IOS.CAMERA
            : PERMISSIONS.ANDROID.CAMERA;
        let response = await check(permission);
        if (response !== RESULTS.GRANTED) {
            response = await request(permission);
        }
        if (response === RESULTS.DENIED || response === RESULTS.BLOCKED) {
            if (withAlert) {
                showAlert(
                    'Permission not granted for Camera. Unable to use camera in this application.',
                );
            }
            return false;
        }
        return true;
    } catch (error) {
        console.log(error);
        return false;
    }
};

const hasPhotoPermission = async (withAlert = true) => {
    try {
        const permission = isIOS
            ? PERMISSIONS.IOS.PHOTO_LIBRARY
            : PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE; // 修正权限常量
        let response = await check(permission);
        if (response !== RESULTS.GRANTED) { // 修正判断逻辑
            response = await request(permission);
        }
        if (response === RESULTS.DENIED || response === RESULTS.BLOCKED) {
            if (withAlert) {
                showAlert(
                    'Permission not granted for photos. Unable to get photos in this application.',
                );
            }
            return false;
        }
        return true;
    } catch (error) {
        console.log(error);
        return false;
    }
};

const PermissionsService = {
    hasCameraPermission,
    hasPhotoPermission,
}

export default PermissionsService;

4. 配置安卓权限清单

在android/app/src/main/AndroidManifest.xml中添加所需权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 安卓13及以上版本使用READ_MEDIA_IMAGES替代WRITE_EXTERNAL_STORAGE -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

5. 清理缓存并重新构建

执行以下命令彻底清理缓存并重新构建安卓项目:

rm -rf node_modules && npm install
cd android && ./gradlew clean && ./gradlew assembleDebug
cd .. && npx react-native run-android

内容的提问来源于stack exchange,提问作者Brent Ibañez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:04:52