鸿蒙应用开发--URI统一资源标识符的生成方式(应用私有文件URI,公共媒体文件URI,用户选择文件URI,网络资源URI,其他应用提供的URI),类别和使用方式

以下是鸿蒙(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://mediaREAD_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" }
    ]
    

五、避坑指南

  1. 临时 URI 失效
    datashare:// 类型的 URI 可能在一段时间后失效,需及时处理。

  2. 跨应用访问限制
    通过 content:// 访问其他应用数据时,需确保对方应用已暴露 ContentProvider。

  3. 资源释放
    使用完 PixelMap 后必须调用 .release() 防止内存泄漏:

    pixelMap.release();
    

六、生活场景类比

URI 类型现实类比使用要点
私有文件 URI你上锁的日记本无需钥匙(权限),但只有自己能开
公共媒体 URI图书馆的公共书籍需要借书证(权限)才能借阅
用户选择文件 URI朋友借给你的书用完后要及时归还(释放资源)
网络资源 URI网购快递单号需要正确的物流渠道(网络权限)

通过理解 URI 的类型和正确使用方式,可以确保应用安全高效地处理各类文件资源!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值