Expo托管工作流下Android权限未授予:仅CAMERA权限生效,AUDIO_RECORDING权限无法获取
Expo Android端录制相关权限无法授予的排查与修复方案
补全app.json中缺失的权限声明
- 当前
app.json的Android权限数组仅配置了CAMERA、AUDIO_RECORDING,完全未覆盖本地存储录制内容所需的全量权限:- 适配Android 12及更低版本,需在
android.permissions数组中补加WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE - 适配Android 13及更高版本,系统拆分了细分媒体存储权限,需补加
READ_MEDIA_VIDEO、READ_MEDIA_AUDIO——未在应用Manifest中声明的权限,系统根本不会触发对应的授权流程
- 适配Android 12及更低版本,需在
- 注意:填写权限名时无需添加
android.permission.前缀,Expo构建阶段会自动补全对应的命名空间
修正权限请求的调用逻辑
- 不要分开多次调用权限请求接口:Android 11及以上系统会拦截短时间内连续触发的多个权限弹窗,通常仅弹出第一个请求的
CAMERA权限,后续的音频、存储权限请求会被系统直接静默拦截,直接返回未授权状态 - 正确的实现方式是在用户触发录制动作的节点,一次性拉起所有所需权限的请求,参考代码片段:
import { Camera } from 'expo-camera'; import * as MediaLibrary from 'expo-media-library'; const prepareRecordingEnvironment = async () => { // 等用户交互触发请求,不要在应用启动阶段空跑无交互的权限弹窗 const cameraPerm = await Camera.requestCameraPermissionsAsync(); const micPerm = await Camera.requestMicrophonePermissionsAsync(); const storagePerm = await MediaLibrary.requestPermissionsAsync(); // 校验所有权限状态通过后再初始化录制器 }
- 禁止在应用启动、用户无任何交互的阶段触发权限请求,国产定制ROM普遍会拦截这类无触发的权限弹窗
核对构建产物的实际配置
- 修改
app.json的权限配置后,必须重新构建自定义开发客户端或生产安装包,不能直接复用旧版本APK测试——很多人改完配置不重新构建,导致实际安装的应用Manifest里根本没有新增的权限项 - 可通过ADB命令快速验证已安装应用的权限列表是否符合预期:
adb shell dumpsys com.myappname.companionapp | grep requested permissions - 若直接使用Expo Go测试需注意:Expo Go内置了固定的权限列表,不会读取项目自定义的权限覆盖配置,必须构建自定义dev客户端才能让你在
app.json里写的权限配置生效
适配国产定制ROM的特殊权限规则
- 小米、vivo、OPPO、华为等定制系统对权限请求有额外限制,当应用同时请求相机和麦克风权限时,系统可能不会单独弹出麦克风授权弹窗,而是将麦克风权限合并到相机的权限设置项中,需要在应用内增加引导页,提示用户手动打开对应的权限开关
- 检查视频录制组件的参数配置:若录制时
mute参数被设置为true,系统会判定应用不需要音频录制权限,自然不会触发对应的麦克风授权流程
内容的提问来源于stack exchange,提问作者xander
相关产品推荐
相关产品推荐

