React Native安卓端RNPermissionsModule缺失及PERMISSIONS未定义问题求助
react-native-permissions v4.0.4 Android端RNPermissionsModule找不到问题
问题描述
开发申请权限后打开相机的React Native应用,使用react-native-permissions v4.0.4版本,安卓设备测试时出现以下错误:
'RNPermissionsModule' could not be found. Invariant Violation: TurboModuleRegistry.getEnforcing(...)- 关联错误:
[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
相关产品推荐
相关产品推荐

