如何在React Native CLI应用中申请ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION权限
在React Native CLI中配置ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION权限
这个权限对应Android 11(API 30)及以上的全文件访问权限,需分清单配置和代码申请两步完成:
一、配置AndroidManifest.xml
仅需修改Android平台的清单文件,路径为 android/app/src/main/AndroidManifest.xml:
- 在
<manifest>根标签内(<application>标签外部)添加权限声明:
<!-- 核心权限:对应ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- 可选:兼容Android 10及以下版本的文件读写 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 若需要兼容Android 10的旧存储模型,在
<application>标签中添加属性:
<application ... android:requestLegacyExternalStorage="true">
二、代码中申请权限
该权限无法通过普通权限弹窗申请,必须引导用户跳转到系统设置页手动开启:
方法1:用React Native内置Linking跳转设置
import { Linking, Platform } from 'react-native'; const requestAllFilesPermission = async () => { if (Platform.OS !== 'android') return; try { // 直接打开应用专属设置页,用户需找到"允许访问所有文件"开关 await Linking.openSettings(); } catch (error) { console.error('跳转权限设置失败:', error); } };
方法2:原生模块检测权限状态(可选)
若需要先判断是否已拥有权限,可自定义Android原生模块:
- 创建
FilePermissionModule.java(路径:android/app/src/main/java/com/[你的包名]/):
package com.yourpackagename; import android.os.Build; import android.os.Environment; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; public class FilePermissionModule extends ReactContextBaseJavaModule { public FilePermissionModule(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "FilePermissionModule"; } @ReactMethod public boolean hasAllFilesPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { return Environment.isExternalStorageManager(); } // Android 10及以下可根据读写权限判断 return true; } }
- 创建
FilePermissionPackage.java注册模块:
package com.yourpackagename; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class FilePermissionPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new FilePermissionModule(reactContext)); return modules; } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } }
- 在
MainApplication.java中添加该包:
@Override protected List<ReactPackage> getPackages() { List<ReactPackage> packages = new PackageList(this).getPackages(); packages.add(new FilePermissionPackage()); return packages; }
- React Native代码中调用检测:
import { NativeModules } from 'react-native'; const { FilePermissionModule } = NativeModules; const checkAndRequestPermission = async () => { const hasPermission = FilePermissionModule.hasAllFilesPermission(); if (!hasPermission) { await requestAllFilesPermission(); } };
关键注意事项
- 该权限仅对Android 11+生效,低版本需用传统读写权限
- Google Play对使用
MANAGE_EXTERNAL_STORAGE权限的应用审核严格,仅文件管理器、备份工具等特定场景允许上线,普通应用谨慎使用
内容的提问来源于stack exchange,提问作者robert_45
相关产品推荐
相关产品推荐

