HarmonyOS 鸿蒙Next怎么判断图片是否为Live图片?

HarmonyOS 鸿蒙Next怎么判断图片是否为Live图片? 鸿蒙上面怎么判断一个图片资源是否为live图片?
当前使用 photoViewPicker.select(photoSelectOptions) 从系统相册获取到的结果也只是一个uri数组,查官方文档说是需要使用 photoAccessHelper.getPhotoAccessHelper().getAssets() 方法进行媒体查询,但是 getAssets 这个方法又需要 ohos.permission.READ_IMAGEVIDEO 权限。这个权限申请又很麻烦,容易导致应用上架被拒绝!

那到底应该怎么判断一个图片是否为live图?求大佬指教 /抱拳


更多关于HarmonyOS 鸿蒙Next怎么判断图片是否为Live图片?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

getAssets

通过picker的方式调用该接口来查询指定URI对应的图片或视频资源,不需要申请’ohos.permission.READ_IMAGEVIDEO’权限.

cke_222.png

判断是否是Live图片:

import { dataSharePredicates } from '@kit.ArkData';

async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper) {
  console.info('getAssets');
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [
      photoAccessHelper.PhotoKeys.WIDTH, // 图片宽度
      photoAccessHelper.PhotoKeys.HEIGHT, // 图片高度
      photoAccessHelper.PhotoKeys.DURATION, // 持续时间
      photoAccessHelper.PhotoKeys.SIZE, // 文件大小
      photoAccessHelper.PhotoKeys.DISPLAY_NAME, // 显示名字
      photoAccessHelper.PhotoKeys.ORIENTATION, // 图片文件的方向
      photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE], // 媒体文件的子类型,
    predicates: predicates
  };

  phAccessHelper.getAssets(fetchOptions, async (err, fetchResult) => {
    if (fetchResult !== undefined) {
      console.info('fetchResult success');
      let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
      if (photoAsset !== undefined) {
        console.info('photoAsset.displayName : ' + photoAsset.displayName);
      }

      const subType = photoAsset.get(photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE);

      // 是否是动态照片文件类型
      if (subType === photoAccessHelper.PhotoSubtype.MOVING_PHOTO) {

      }

    } else {
      console.error(`fetchResult fail with error: ${err.code}, ${err.message}`);
    }
  });
}

更多关于HarmonyOS 鸿蒙Next怎么判断图片是否为Live图片?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


开发者你好,通过picker的方式调用该接口来查询指定URI对应的图片或视频资源,不需要申请’ohos.permission.READ_IMAGEVIDEO’权限,详情请参考指定URI获取图片或视频资源

在HarmonyOS Next中,通过PhotoAccessHelper查询媒体项,检查其mediaTypesubType属性。若subType值为PHOTO_SUBTYPE_LIVE,则该图片为Live图片。也可通过ImageSource读取图片的extraInfoisLivePhoto字段为true来判断。

不用申请 ohos.permission.READ_IMAGEVIDEO 权限。

你通过 PhotoViewPicker 选中的图片,系统已经赋予了临时的读写权限。利用这个临时权限,使用 getAssets 接口查询其元数据,就能判断是否为动态照片了。

核心是检查 PhotoKeys.PHOTO_SUBTYPE 的值是否等于 PhotoSubtype.MOVING_PHOTO

参考代码如下:

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { dataSharePredicates } from '@kit.ArkData';

async function checkIfLivePhoto(uri: string): Promise<boolean> {
  try {
    let helper = photoAccessHelper.getPhotoAccessHelper(getContext());
    // 基于 URI 构建查询条件
    let predicates = new dataSharePredicates.DataSharePredicates();
    predicates.equalTo(photoAccessHelper.PhotoKeys.URI, uri);

    let fetchOptions: photoAccessHelper.FetchOptions = {
      fetchColumns: [photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE],
      predicates: predicates
    };

    const fetchResult = await helper.getAssets(fetchOptions);
    const asset = await fetchResult.getFirstObject();
    
    // 核心逻辑:判断子类型
    return asset.photoSubType === photoAccessHelper.PhotoSubtype.MOVING_PHOTO;
  } catch (err) {
    console.error('查询失败:', JSON.stringify(err));
    return false;
  }
}

这样既不用申请敏感权限,也能准确判断是否为 Live 图。

回到顶部