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

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.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 10:45:00