写点什么

HarmonyOS 动态照片,简易环境助力高效开发

  • 2025-09-25
    北京
  • 本文字数:4025 字

    阅读完需:约 13 分钟

大小:946.63K时长:05:23
HarmonyOS动态照片,简易环境助力高效开发

随着移动终端体验的不断提升,动态照片这种有趣味与表现力的内容形式,越来越受到用户的青睐。HarmonyOS 允许用户在设备上查看和处理动态照片,这些照片不仅包含静态图像,还融合了视频片段,为用户提供更加丰富和生动的视觉体验。Media Library Kit 媒体库提供动态照片的创建和管理能力,为开发者带来全新的开发场景和优化空间。


一、 保存与播放动态照片

动态照片作为一种记录和分享生活瞬间的方式,广泛应用于各大社交软件中。用户通过拍摄动态照片,捕捉并分享那些稍纵即逝的美好时刻,并将浏览的精彩画面保存到本地。为了提升这一体验,Media Library Kit 提供了完整的动态照片保存与播放的 API 接口。

 

1、使用安全控件保存动态照片

为支持应用保存动态照片资源,媒体库在 MediaAssetChangeRequest 类中提供了创建和保存动态照片的接口,应用可以灵活地将自己沙箱下的图片和视频资源保存至媒体库,涉及接口如下:

// 创建资产变更请求,需要在CreateOptions中指定subtype为动态照片static createAssetRequest(context: Context, photoType: PhotoType, extension: string, options?: CreateOptions): MediaAssetChangeRequest;// 通过fileUri从应用沙箱添加资源addResource(type: ResourceType, fileUri: string): void;// 通过ArrayBuffer添加资源addResource(type: ResourceType, data: ArrayBuffer): void;// 提交资产变更请求,在媒体库创建动态照片资产applyChanges(mediaChangeRequest: MediaChangeRequest): Promise<void>;
复制代码


对没有读写权限的应用,HarmonyOS 提供安全控件的方式保存媒体资源,应用可以临时获取媒体库存储权限,整个保存流程更简易。下面是使用安全控件保存动态照片的示例:

// 设置安全控件按钮属性saveButtonOptions: SaveButtonOptions = {  icon: SaveIconStyle.FULL_FILLED,  text: SaveDescription.SAVE_IMAGE,  buttonType: ButtonType.Capsule}// 创建安全控件按钮SaveButton(this.saveButtonOptions)  .onClick(async (event, result: SaveButtonOnClickResult) => {    if (result == SaveButtonOnClickResult.SUCCESS) {      let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;      let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);      // 创建资产变更请求,subtype类型为动态照片      let changeRequest = photoAccessHelper.MediaAssetChangeRequest.createAssetRequest(        context, photoAccessHelper.PhotoType.IMAGE, "jpg", {        title: 'moving_photo',        subtype: photoAccessHelper.PhotoSubtype.MOVING_PHOTO      });      // 添加要保存的文件uri,文件资源位于应用沙箱      let imageUri = 'file://com.example.myapplication/data/storage/el2/base/haps/entry/files/mov_1.jpg';      let videoUri = 'file://com.example.myapplication/data/storage/el2/base/haps/entry/files/mov_1.mp4';      changeRequest.addResource(photoAccessHelper.ResourceType.IMAGE_RESOURCE, imageUri);      changeRequest.addResource(photoAccessHelper.ResourceType.VIDEO_RESOURCE, videoUri);      // 提交资产变更请求      await phAccessHelper.applyChanges(changeRequest);    }  })
复制代码

 

2、访问和播放动态照片

媒体库为应用提供了统一的动态照片访问接口 requestMovingPhoto 和 MovingPhoto 对象,支持应用读取动态照片。同时,MovingPhotoView 组件用于播放动态照片,为用户提供沉浸、流畅的动图体验。

1、MediaAssetManager-requestMovingPhoto 接口:支持读取动态照片对象。

2、MovingPhoto 对象:支持读取动态照片的图片和视频内容。

3、MovingPhotoViewController:控制动态照片的播放状态(如播放、停止)。

动态照片的图片部分由 HarmonyOS 分段式拍照统一出图,因此 requestMovingPhoto 接口支持按照不同图片模式请求读取动态照片对象。

// 根据不同的requestOptions模式,请求动态照片对象requestMovingPhoto(context: Context, asset: PhotoAsset, requestOptions: RequestOptions, dataHandler: MediaAssetDataHandler<MovingPhoto>): Promise<string>
复制代码


应用通过配置接口参数 RequestOptions . DeliveryMode 就能实现以下三种请求:

1、快速模式(DeliveryMode.FAST_MODE):立刻为应用返回当前准备好的图片。

2、高质量模式(DeliveryMode. HIGH_QUALITY_MODE):向应用返回全质量图。若未生成,媒体库会主动触发底层生成二阶段图片任务,并为应用返回全质量图片。

3、均衡模式(DeliveryMode. BALANCE_MODE):若全质量图已经生成,则直接返回给应用。否则,先向应用返回低质量图,然后触发二阶段任务,待全质量图片生成后再次返回。

// 创建动态照片处理器,当请求的资源准备完成时触发回调class MovingPhotoHandler implements photoAccessHelper.MediaAssetDataHandler<photoAccessHelper.MovingPhoto> {  async onDataPrepared(movingPhoto: photoAccessHelper.MovingPhoto) {    if (movingPhoto === undefined) {      console.error('Error occurred when preparing data');      return;    }    console.info("moving photo acquired successfully, uri: " + movingPhoto.getUri());  }}// 从媒体库中读取动态照片assetlet predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();predicates.equalTo(photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE, photoAccessHelper.PhotoSubtype.MOVING_PHOTO);let fetchOptions: photoAccessHelper.FetchOptions = {  fetchColumns: [],  predicates: predicates};let assetResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);let asset: photoAccessHelper.PhotoAsset = await assetResult.getFirstObject();// 以FAST_MODE模式为例,请求动态照片对象let requestOptions: photoAccessHelper.RequestOptions = { deliveryMode: photoAccessHelper.DeliveryMode.FAST_MODE, }const handler = new MovingPhotoHandler();try {  let requestId: string = await photoAccessHelper.MediaAssetManager.requestMovingPhoto(context, asset, requestOptions, handler);  console.info("moving photo requested successfully, requestId: " + requestId);} catch (err) {  console.error(`failed to request moving photo, error code is ${err.code}, message is ${err.message}`);}
复制代码


获取到 MovingPhoto 对象后,开发者可以利用 ArkTS 组件播放动态照片。HarmonyOS 提供 MovingPhotoView 组件展示动态照片,其参数 MovingPhotoViewOptions 可供应用选择播放动态照片的数据源(MovingPhoto 对象)和播放控制器(MovingPhotoViewController)。

MovingPhotoView(options: MovingPhotoViewOptions) // 动态照片组件
复制代码


控制器用来控制动态照片的播放状态,当前可使用的状态有如下三种:

1、startPlayback():开始播放动态照片。

2、stopPlayback():停止播放,再次播放时从头开始。

3、refreshMovingPhoto():强制刷新动态照片组件加载的视频和图片资源。

Media Library Kit 提供了多种形式播放动态照片的示例,请参考 API 指南使用 MovingPhotoView 组件。


二、 拍摄并保存动态照片

大多社交软件都为用户提供拍摄动态照片功能,方便用户随时查看和分享图片。HarmonyOS 动态照片的拍摄采用分段式拍照统一出图流程,旨在让相机类应用的用户体验与系统相机一致,通过统一拍照流程提升拍照体验。在拍照过程中,相机应用的参与流程被减弱,所有操作均由底层框架进行,MediaLibrary Kit 参与动态照片拍摄的具体流程图如下:

 

流程 1、一阶段动态照片拍摄时,相机应用向相机框架下发拍摄命令,相机框架将命令传递给 HAL 层。相机 HAL 抓取两路流(图片流和视频流)并传递至相机框架。图片流由相机框架传递给媒体库,保存为一阶段 80 分图片。相机框架完成动态照片视频编码后,将视频传递给媒体库保存。

 

流程 2、相机应用通过 saveCameraPhoto 接口保存动图,并传递用户拍摄时选择的水印和滤镜数据。媒体库接收到保存命令和编辑数据后,将原始图片、原始视频和编辑数据通过编创框架和视频编辑生成效果动态照片。

 

流程 3、媒体库将二段式任务传递给相机框架,相机框架根据系统资源情况适时触发。二阶段图片生成后,媒体库使用 100 分图片替换一阶段的 80 分图片,并进行效果图和缩略图的刷新。在图库和三方应用访问新拍摄动态照片的场景中,媒体库会高优先级触发动态照片的二段式任务。当底层完成二段式照片的生成后,媒体库对一阶段图片进行替换,并根据编辑数据生成新的效果图。

 

媒体库为开发者提供 saveCameraPhoto 接口保存拍摄的动态照片,应用通过监听动态照片拍照输出流状态,在回调函数中保存图片。

// asset由监听动态照片输出流获得async function example(asset: photoAccessHelper.PhotoAsset, context: Context) {  try {    let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);    let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(asset);    assetChangeRequest.saveCameraPhoto();    // 提交保存请求    await phAccessHelper.applyChanges(assetChangeRequest);    console.info('apply saveCameraPhoto successfully');  } catch (err) {    console.error(`apply saveCameraPhoto failed with error: ${err.code}, ${err.message}`);  }}
复制代码

 

HarmonyOS 为动态照片提供了原生、易用、高性能的解决方案。了解更多鸿蒙动态照片相关指导,请访问 HarmonyOS 开发者官网:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/movingphoto-V5

2025-09-25 11:323304

评论

发布
暂无评论

2月券商App行情刷新及交易体验报告,东方与安信升至领导者象限

博睿数据

架构实战营:模块五作业

刘璐

基于爬虫的测试自动化经验分享

FunTester

爬虫 性能测试 办公自动化 FunTester 测试自动化

设计微博系统中”微博评论“的高性能高可用计算架构

IT屠狗辈

架构实战营 微博评论架构实战

高可用演练中堆叠切换失败分析

BUG侦探

高可用 堆叠 链路聚合

微博评论的高性能高可用计算架构设计

五月雨

架构实战营 「架构实战营」

Flutter仿微信价值几个亿的页面

岛上码农

flutter ios开发 Android开发 移动端开发 3月月更

discuz防止恶意注册!

喀拉峻

网络安全

模块五作业

blazar

「架构实战营」

吕氏餐饮:用宜搭智能考核绩效,人事管理更高效

一只大光圈

低代码 数字化 钉钉宜搭

“易+”开源 | 网易会议开源之移动端篇

网易云信

开发

【英雄大会】之谁说站在光里的才算英雄(上篇)

Anna

经历分享 作者 简介

深度强化学习的“丛林”大冒险

脑极体

Golang 1.18正式版发布,正式加入泛型语言家庭

学神来啦

Go golang Go 语言

“微博评论”的高性能高可用计算架构

张逃逃

模块五 评论计算架构

Geek_28cf33

经验分享 | 最佳文档协作软件推荐

小炮

一文读懂可观测性与Opentelemetry

博睿数据

测性能,拿周边|OceanBase 3.1.2 版邀你来玩

OceanBase 数据库

在线JSON转HTML工具

入门小站

工具

“微博评论”的高性能、高可用架构设计

凌波微步

「架构实战营」

微博“发评论”高性能高可用计算架构

Fingal

#架构实战营

透过荣耀耳机的三重“炼金术”,重识TWS行业

脑极体

Linux之ack命令

入门小站

Linux

SpringCloud-Feign

昊运

SpringCloud

海量非结构化数据副本难保护,焱融科技携手英方推出联合解决方案

焱融科技

云计算 分布式 云原生 高性能 文件存储

如何设计信息安全领域的实时安全基线引擎

Apache Flink

大数据 flink 开源 编程 实时计算

【图解数据结构】树和二叉树全面总结

知心宝贝

二叉树 数据结构与算法 二叉树遍历 3月月更 树和二叉树

微博评论高性能高可用计算架构

石小天

「架构实战营」

架构训练营 模块五

Geek_16d2b8

架构训练营5期

在线JSON转CSV格式文件工具

入门小站

工具

HarmonyOS动态照片,简易环境助力高效开发_HarmonyOS_HarmonyOS_InfoQ精选文章