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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:01