使用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
相关产品推荐
相关产品推荐

