为何Expo Bare Workflow安卓项目会自动授予文件与媒体存储权限?
问题根因
Expo SDK 43 对应的expo-media-library 13.x版本在bare workflow下默认会自动注入存储权限的自动授予逻辑,原因是包内部默认开启了权限自动授予配置,且针对Android不同版本的权限适配逻辑默认跳过了弹窗申请,直接返回授权成功。
解决方案
步骤1:修改AndroidManifest.xml的权限声明
你需要给已有的存储权限声明添加覆盖配置,先在manifest根节点添加tools命名空间,再修改权限声明节点,覆盖expo模块自动注入的默认配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="你的应用包名"> <!-- 覆盖自动注入的权限配置 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="replace"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace" android:maxSdkVersion="32"/>
注:Android 13(SDK33)及以上版本已拆分细化媒体权限,WRITE_EXTERNAL_STORAGE权限仅对32及以下版本生效。
步骤2:禁用expo-media-library的自动授权配置
在项目的android/app/src/main/res/values目录下新建expo_permissions.xml文件,添加如下配置:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="expo_media_library_auto_grant_permissions">false</bool> </resources>
该配置会强制关闭包内部默认的自动授权逻辑,触发系统原生的权限申请弹窗。
步骤3:清理缓存重新构建应用
执行如下命令清理构建缓存后重新安装应用:
cd android && ./gradlew clean cd .. && npx react-native run-android
测试前必须完全卸载设备上的旧版本应用,避免权限缓存影响测试结果。
额外适配说明
如果你的应用需要适配Android 12及以上版本的媒体位置访问需求,还需要在Manifest中添加ACCESS_MEDIA_LOCATION权限,调用MediaLibrary.requestPermissionsAsync时也需要同步申请该权限。
内容的提问来源于stack exchange,提问作者Jkkarr
相关产品推荐
相关产品推荐

