以下是鸿蒙(HarmonyOS)中 URI(统一资源标识符) 的全面解析,以清晰易懂的方式分类说明:
一、URI 的生成方式
1. 应用私有文件 URI
- 生成方式:系统自动分配
当应用在沙箱内创建文件时,系统自动生成固定格式的 URI。 - 示例:
const context = getContext(this); const filePath = context.filesDir + '/data.txt'; // 生成URI: internal://app/files/data.txt
2. 公共媒体文件 URI
- 生成方式:通过媒体库 API 获取
访问相册、音乐等公共资源时通过photoAccessHelper
/mediaLibrary
生成。 - 示例:
const picker = new photoAccessHelper.PhotoViewPicker(); const result = await picker.select(); const mediaUri = result.photoUris[0]; // 类似: file://media/images/sunset.jpg
3. 用户选择文件 URI
- 生成方式:通过文件选择器 (
filePicker
)
用户手动选择文件后,系统返回临时访问权限的 URI。 - 示例:
const uris = await filePicker.select(); const pickedUri = uris[0]; // 类似: datashare://com.example.provider/123
4. 网络资源 URI
- 生成方式:直接指定 URL
明确网络地址即可。 - 示例:
const url = 'https://example.com/image.jpg';
5. ContentProvider URI
- 生成方式:通过其他应用提供的 ContentProvider
跨应用共享数据时使用。 - 示例:
const contentUri = 'content://com.example.provider/data/1';
二、URI 的类别
类别 | 标识前缀 | 访问权限 | 典型场景 |
---|---|---|---|
应用私有文件 | internal://app | 仅本应用(无需权限) | 保存用户配置、缓存数据 |
公共媒体文件 | file://media | 需 READ_MEDIA 权限 | 读取相册照片、播放音乐 |
用户选择文件 | datashare:// | 临时权限(选择后生效) | 用户上传文件、导入文档 |
网络资源 | http:// 或 https:// | 网络权限 | 加载网络图片、下载文件 |
ContentProvider 数据 | content:// | 依赖提供方应用的权限 | 跨应用共享数据(如通讯录) |
三、URI 的使用方式
1. 应用私有文件
- 写入数据:
const filePath = context.filesDir + '/log.txt'; await fileIo.writeText(filePath, '这是一条日志');
- 读取数据:
const content = await fileIo.readText(filePath);
2. 公共媒体文件
- 显示图片:
const imageSource = photoAccessHelper.createImageSource(mediaUri); const pixelMap = await imageSource.createPixelMap(); Image(pixelMap);
- 删除文件:
const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); const asset = await phAccessHelper.getPhotoAsset(mediaUri); await phAccessHelper.deleteAssets([asset]);
3. 用户选择文件
- 读取内容:
const file = await fileIo.open(pickedUri, fileIo.OpenMode.READ_ONLY); const buffer = new ArrayBuffer(1024); await fileIo.read(file.fd, buffer); fileIo.close(file.fd);
4. 网络资源
- 加载图片:
Image($r('app.media.network_image')) .loadFrom(url); // 直接使用URL
四、关键操作技巧
1. URI 转换真实路径
import { fileUri } from '@kit.CoreFileKit';
// 转换支持的URI类型(如file://)
const realPath = fileUri.getRealPath(uri);
console.log(realPath); // 输出: /storage/emulated/0/DCIM/Camera/photo.jpg
2. 检查文件类型
if (uri.startsWith('internal://app')) {
console.log('这是应用私有文件');
} else if (uri.startsWith('datashare://')) {
console.log('这是用户选择的临时文件');
}
3. 权限管理
- 私有文件:无需权限
- 公共文件:需在
config.json
声明并动态申请:"reqPermissions": [ { "name": "ohos.permission.READ_MEDIA" } ]
五、避坑指南
-
临时 URI 失效
datashare://
类型的 URI 可能在一段时间后失效,需及时处理。 -
跨应用访问限制
通过content://
访问其他应用数据时,需确保对方应用已暴露 ContentProvider。 -
资源释放
使用完PixelMap
后必须调用.release()
防止内存泄漏:pixelMap.release();
六、生活场景类比
URI 类型 | 现实类比 | 使用要点 |
---|---|---|
私有文件 URI | 你上锁的日记本 | 无需钥匙(权限),但只有自己能开 |
公共媒体 URI | 图书馆的公共书籍 | 需要借书证(权限)才能借阅 |
用户选择文件 URI | 朋友借给你的书 | 用完后要及时归还(释放资源) |
网络资源 URI | 网购快递单号 | 需要正确的物流渠道(网络权限) |
通过理解 URI 的类型和正确使用方式,可以确保应用安全高效地处理各类文件资源!