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

使用expo-media-library保存ph://格式图片至相册报错,请求排查代码

Expo Media Library 保存ph://资源到相册报错排查

报错原因

你传入的ph://格式URI是iOS系统图库中已有资源的标识,并非实际文件路径。createAssetAsync方法需要解析文件扩展名来创建新资产,但ph:// URI本身不包含扩展名信息,因此触发Could not get the file's extension - it was empty.错误。

修复方案

既然ph://对应的是图库中已存在的资产,不需要调用createAssetAsync重新创建,直接通过MediaLibrary.getAssetInfoAsync获取该资产的完整对象即可,再将其添加到目标相册。

修改后的代码

import * as MediaLibrary from 'expo-media-library';

const createAlbumAndAddImage = async (imageUri) => {
  try {
    // 请求媒体库权限
    const { status } = await MediaLibrary.requestPermissionsAsync();
    if (status !== 'granted') {
      console.error('媒体库权限未授权');
      return;
    }

    // 直接获取ph://对应的已存在资产,无需重新创建
    const asset = await MediaLibrary.getAssetInfoAsync(imageUri);
    console.log('获取到的资产:', asset);

    // 相册名称
    const albumName = 'Keep Or Del';

    // 检查相册是否存在
    const albums = await MediaLibrary.getAlbumsAsync();
    let album = albums.find((a) => a.title === albumName);

    // 不存在则创建相册
    if (!album) {
      album = await MediaLibrary.createAlbumAsync(albumName, asset, false); // false 表示不发送通知
      console.log(`相册 "${albumName}" 创建成功`);
    } else {
      // 存在则添加资产到相册
      await MediaLibrary.addAssetsToAlbumAsync([asset], album.id, false);
      console.log(`资产已添加到相册 "${albumName}"`);
    }

    // 验证资产是否在相册中
    const albumAssets = await MediaLibrary.getAssetsAsync({
      album: album.id,
      first: 100, // 最多获取100个资产
    });
    console.log('相册中的资产:', albumAssets.assets.map((a) => a.uri));
  } catch (error) {
    console.error('创建相册或添加资产失败:', error);
  }
};

export default createAlbumAndAddImage;

额外说明

  • getAssetInfoAsync专门用于获取系统图库中已有资产的详情,支持ph://格式的URI
  • 只有当你需要从本地文件(如file://路径)或网络资源创建新的图库资产时,才需要使用createAssetAsync

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:55:56