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

Expo SDK47中Expo-Image-Picker在Android端无法正常工作求助

Expo ImagePicker 在 Android 设备返回全 undefined 问题排查方案

问题复现

使用 Expo SDK47 + Expo-Image-Picker 时,iOS 端选择图片功能正常,但三星、华为等 Android 设备选择图片后,返回对象的所有属性均为 undefined,返回示例如下:

Object {
  "assetId": undefined,
  "base64": undefined,
  "cancelled": undefined,
  "exif": undefined,
  "height": undefined,
  "type": undefined,
  "uri": undefined,
  "width": undefined,
}

当前使用的核心代码:

async function handleImage(){        
  try {
      let result = await ImagePicker.launchImageLibraryAsync({
          mediaTypes: ImagePicker.MediaTypeOptions.Images,
          quality: 1,
        });
  
      if (!result.cancelled) {
        setImage(result.uri);
      }
      console.log(result) 
  } catch (error) {
      console.log(error)
  }
}

排查与解决步骤

1. 补全 Android 权限配置

Android 13+ 新增了 READ_MEDIA_IMAGES 权限,需在 app.json/app.config.js 中添加配置:

{
  "expo": {
    "android": {
      "permissions": [
        "READ_MEDIA_IMAGES",
        "CAMERA" // 若用到相机功能需添加
      ]
    }
  }
}

同时在代码中主动请求权限:

import { PermissionsAndroid, Platform } from 'react-native';

async function requestPermissions() {
  if (Platform.OS === 'android') {
    const permission = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES
    );
    return permission === PermissionsAndroid.RESULTS.GRANTED;
  }
  return true;
}

// 修改 handleImage 先校验权限
async function handleImage(){        
  try {
    const hasPermission = await requestPermissions();
    if (!hasPermission) {
      console.log('存储权限被拒绝');
      return;
    }
    let result = await ImagePicker.launchImageLibraryAsync({
        mediaTypes: ImagePicker.MediaTypeOptions.Images,
        quality: 1,
      });
  
    if (!result.cancelled) {
      setImage(result.uri);
    }
    console.log(result) 
  } catch (error) {
      console.log(error)
  }
}

2. 锁定适配 SDK47 的 ImagePicker 版本

SDK47 对应的 Expo ImagePicker 稳定版本为 ~14.0.2,确认 package.json 中的版本后重新安装:

"expo-image-picker": "~14.0.2"

执行安装命令:

npm install expo-image-picker@~14.0.2
# 或使用 yarn
yarn add expo-image-picker@~14.0.2

3. 检查国产 Android 系统的存储权限策略

部分国产系统(如华为鸿蒙、三星 One UI)有特殊存储限制,需手动开启应用的「访问所有文件」权限:

  • 进入系统设置 → 应用管理 → 找到你的应用 → 权限管理 → 存储 → 选择「允许访问所有文件」

4. 添加完整的 ImagePicker 配置参数

尝试补充 allowsEditing 和 aspect 参数,避免因配置缺失导致异常:

let result = await ImagePicker.launchImageLibraryAsync({
  mediaTypes: ImagePicker.MediaTypeOptions.Images,
  quality: 1,
  allowsEditing: false,
  aspect: [4, 3],
});

5. 清除缓存并重建项目

# 清除 Expo 缓存并重启项目
expo r -c

# 若为裸项目,清除 Node 模块后重建
rm -rf node_modules package-lock.json
npm install
expo prebuild --clean

内容的提问来源于stack exchange,提问作者KaganBerk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:05:41