以下是鸿蒙(HarmonyOS)中 用户文件 URI 的通俗解释,结合生活场景和示例代码说明:


一、URI 的三种常见类型

想象你有一本书,URI 就像是这本书的“地址”,告诉系统去哪里找到它。鸿蒙中的 URI 主要分为三类:

URI 类型 比喻 特点 示例
应用私有文件 URI 你个人抽屉里的笔记本 仅你的应用能访问,无需权限 internal://app/files/diary.txt
公共媒体库 URI 图书馆的公开书架上的书 需要权限,所有应用都可访问(需用户授权) file://media/images/photo.jpg
用户选择文件 URI 朋友借给你的书(临时权限) 通过文件选择器获得,临时访问权 datashare://provider/123

二、URI 的使用方法

1. 应用私有文件(你的抽屉)

场景:保存应用的配置、缓存等私有文件。

// 写入文件到私有目录
const context = getContext(this);
const filePath = context.filesDir + '/config.txt'; // 生成URI:internal://app/files/config.txt

// 写入内容
fileIo.writeText(filePath, '这是我的秘密配置');

2. 公共媒体文件(公共书架)

场景:读取相册中的照片或音乐。

// 选择相册图片(需要权限)
const picker = new photoAccessHelper.PhotoViewPicker();
const result = await picker.select({ MIMEType: 'image/*' });
const mediaUri = result.photoUris[0]; // 类似:file://media/images/sunset.jpg

// 加载图片
const imageSource = photoAccessHelper.createImageSource(mediaUri);
const pixelMap = await imageSource.createPixelMap();
Image(pixelMap); // 显示图片

3. 用户选择的文件(借来的书)

场景:用户通过文件管理器选择文档。

// 通过文件选择器获取URI
const filePicker = new filePicker.FilePicker();
const uris = await filePicker.select({ fileTypes: ['.pdf'] });
const selectedFileUri = uris[0]; // 类似:datashare://com.example.provider/123

// 读取文件内容
const file = await fileIo.open(selectedFileUri, fileIo.OpenMode.READ_ONLY);
const content = await fileIo.readText(file.fd);
fileIo.close(file.fd);

三、URI 的通用操作

1. 判断文件类型
if (uri.startsWith('internal://app')) {
  console.log('这是应用私有文件');
} else if (uri.startsWith('file://media')) {
  console.log('这是公共媒体文件');
} else if (uri.startsWith('datashare://')) {
  console.log('这是用户临时选择的文件');
}

2. 转换真实路径

注意:直接操作路径可能不安全,建议使用 API 操作文件。

import { fileUri } from '@kit.CoreFileKit';

// 将URI转为真实路径(仅限部分URI类型)
const realPath = fileUri.getRealPath(uri);

四、注意事项(避坑指南)

  1. 权限问题

    • 访问公共文件需在 config.json 添加权限:
      "reqPermissions": [
        { "name": "ohos.permission.READ_MEDIA" }
      ]
      
  2. 临时权限

    • 用户选择的文件 URI (datashare://) 可能失效,需及时处理。
  3. 资源释放

    // 用完 PixelMap 要释放
    pixelMap.release();
    
    // 文件操作后要关闭
    fileIo.close(fd); 
    

五、生活场景类比

  • 私有文件:像你上锁的日记本,只有你自己能打开。
  • 公共媒体:像客厅的电视,家人(其他应用)想看需要你同意。
  • 用户选择文件:像朋友借你的 U 盘,用完后记得归还(释放资源)。

通过理解这些 URI 类型和使用场景,你可以安全高效地操作鸿蒙应用中的文件!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐