HarmonyOS 鸿蒙Next中拓展信息读取

HarmonyOS 鸿蒙Next中拓展信息读取 如何解决fs接口无法读取媒体文件扩展信息问题

3 回复

【背景知识】

如果使用的是photoAccessHelper.getAssets这个接口前提是需要申请ohos.permission.READ_IMAGEVIDEO权限,如果不申请,无法获取对应的的信息。但是可以通过fs.openSync后,间接区分文件类型,并获取图片缩略图,视频时长等信息。

【解决方案】

可以按照下面方式来获取文件的拓展信息:

1.获取到url后,使用使用fs.openSync接口,通过uri打开这个文件得到fd:

let file = fs.openSync(selectUris[0], fs.OpenMode.READ_ONLY);

2.目前没有直接判断文件类型的方法,可以通过截取文件后缀的方式判断是图片还是视频:

getPathExtension(url) {
  const lastDotIndex = url.lastIndexOf('.');
  if (lastDotIndex < 0) {
    return ''; // 没有找到扩展名
  }
  return url.slice(lastDotIndex + 1);
}

3.通过后缀区分图片和视频后,分别获取相关信息。

  • 图片: 将图片转为pixelmap之后使用getImageInfo等接口获取图片相关信息:
// 根据文件fd创建imagSource
const imageSource: image.ImageSource = image.createImageSource(file.fd);
// 完成后关闭fd
fs.closeSync(file);
let decodingOptions: image.DecodingOptions = {
editable: true,
desiredPixelFormat: 3,
}
// 创建pixelMap
imageSource.createPixelMap(decodingOptions).then(async (pixelMap1: image.PixelMap) => {
// pixelMap1的信息可以在这里获取
});
import image from '@ohos.multimedia.image';
import { fileIo } from '@kit.CoreFileKit';
import fileIO from '@ohos.fileio';
import { media } from '@kit.MediaKit';

let context = getContext(this)
let filesDir = context.filesDir
let filePath = filesDir + "/" + "video.mp4"

@Entry
@Component
struct GetVideoInfoFromSandbox {
  @State message: string = 'Hello World';
  @State pixelMap: image.PixelMap | undefined = undefined;

  build() {
    Column({ space: 10 }) {

      Text("把视频保存到沙箱")
        .fontSize(50)
        .backgroundColor(Color.Blue)
        .fontWeight(FontWeight.Bold)
        .onClick(async () => {
          let value = await context.resourceManager.getRawFileContent('video.mp4')
          console.info(`${value.buffer.byteLength}`)
          let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
          // 将rawfile目录下的文件写入沙箱路径
          fileIo.writeSync(file.fd, value.buffer)
          fileIo.closeSync(file.fd)
        })

      Text("获取视频文件宽高")
        .fontSize(50)
        .backgroundColor(Color.Green)
        .fontWeight(FontWeight.Bold)
        .onClick(async () => {
          // 创建AVMetadataExtractor实例
          let avMetadataExtractor = await media.createAVMetadataExtractor();

          avMetadataExtractor.fdSrc = fileIo.openSync(filePath);
          // 获取媒体元数据
          let metadata = await avMetadataExtractor.fetchMetadata()
          // 打印宽高数据
          console.info(`metadata.videoWidth:${metadata.videoWidth}`)
          console.info(`metadata.videoHeight:${metadata.videoHeight}`)
        })

    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

更多关于HarmonyOS 鸿蒙Next中拓展信息读取的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,拓展信息读取主要通过@ohos.file.securityLabel模块实现。该模块提供数据安全分级标签管理功能,支持读取文件或数据的敏感级别标签。开发者可使用getSecurityLabel接口获取文件的安全标签信息,返回结果包含数据级别和权限类型等属性。系统会根据应用权限动态控制可访问的标签范围,确保数据安全合规访问。读取操作需在配置文件声明ohos.permission.READ_SECURITY_LABEL权限。

在HarmonyOS Next中,若遇到fs接口无法读取媒体文件扩展信息的问题,可通过以下步骤排查解决:

  1. 检查文件路径与权限
    确保目标媒体文件路径正确,且应用已申请ohos.permission.READ_MEDIA权限。在module.json5中添加:

    "requestPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA",
        "reason": "$string:reason_desc",
        "usedScene": { "abilities": ["EntryAbility"], "when": "always" }
      }
    ]
    
  2. 使用媒体库管理接口
    fs接口适用于基础文件操作,媒体文件元数据(如EXIF、时长等)需通过[@ohos](/user/ohos).file.mediaLibrary接口获取:

    import mediaLibrary from '[@ohos](/user/ohos).file.mediaLibrary';
    
    // 获取媒体库实例并查询媒体文件
    const media = mediaLibrary.getMediaLibrary(context);
    let fileKey = mediaLibrary.FileKey;
    let fetchOp = {
      selections: `${fileKey.DISPLAY_NAME}=?`,
      selectionArgs: ['example.jpg']
    };
    let fetchResult = await media.getFileAssets(fetchOp);
    let fileAsset = await fetchResult.getFirstObject();
    console.log(`文件时长: ${fileAsset.duration}`); // 获取视频/音频时长
    
  3. 解析特定元数据
    若需解析图片EXIF等复杂信息,可结合[@ohos](/user/ohos).multimedia.image接口:

    import image from '[@ohos](/user/ohos).multimedia.image';
    
    // 通过PixelMap获取图片属性
    let imagePacker = image.createImagePacker();
    let packOptions = { format: "image/jpeg", quality: 98 };
    let data = await imagePacker.packing(fileAsset, packOptions);
    // 进一步解析二进制数据中的元数据
    
  4. 验证文件格式支持
    确认目标文件格式为系统支持的媒体类型(如MP4、JPEG、PNG),非常见格式可能需自行解析文件二进制结构。

通过以上方法,可准确获取媒体文件的扩展信息。若问题仍存在,建议检查系统日志中的详细错误码。

回到顶部