更新记录

1.0.0(2026-10-31)

  • 首个版本,仅支持 App-Android(minSdkVersion 21)
  • 新增 combiner:jpg + mp4 合成实况照片(XMP 采用小米 MicroVideo 写法,华为/荣耀机型自动追加 60 字节尾部信息)
  • 新增 split:实况照片分离为静态 jpg 与 mp4,按「华为尾部 -> 小米 MicroVideoOffset -> Google XMP Item Length -> ftyp 扫描」四级识别
  • 新增 requestPermissions / checkAllFilesPermission / toAllFilesPermissionPage 存储权限辅助方法
  • 所有方法统一 { params, success, fail, complete } 形态,回调结构为 { code, data, message }
  • 支持普通路径、file:// 前缀与 content://(后者复制到应用缓存目录)

平台兼容性

uni-app(4.72)

Vue2 Vue2插件版本 Vue3 Vue3插件版本 Chrome Safari app-vue app-vue插件版本 app-nvue app-nvue插件版本 Android Android插件版本 iOS 鸿蒙
√ 1.0.0 √ 1.0.0 × × √ 1.0.0 √ 1.0.0 5.0 1.0.0 × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × - × × × × - × ×

uni-app x(4.72)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
× × 5.0 1.0.0 × × ×

zy-livePhoto

实况照片(Motion Photo)合成与分离 UTS 插件,仅支持 Android(uni-app / uni-app x)。

插件能力

  • combiner:把一张 jpg 图片 + 一段 mp4 视频合成实况照片(jpg 内写入 XMP 元数据,尾部追加 mp4 数据)
  • split:把实况照片分离成静态 jpg 与 mp4 视频
  • requestPermissions / checkAllFilesPermission / toAllFilesPermissionPage:存储权限辅助方法

兼容性

平台 支持
App-Android ✅(minSdkVersion 21)

合成结果的 XMP 采用小米 GCamera:MicroVideo 写法(同时写入 Google MotionPhoto Container 字段),国内相册(小米/OPPO/vivo/华为)与 Google Photos 均可识别;在华为/荣耀机型上会自动追加 60 字节尾部信息(v2_f29 + 207:1000 + LIVE_<长度>)以兼容其系统相册。

分离支持 4 级识别策略,依次为:

  1. 华为尾部信息(最后 40 字节内的 LIVE_<长度>)
  2. 小米 GCamera:MicroVideoOffset
  3. Google Container:Item 的 Item:Length(MotionPhoto 语义)
  4. 按 ftyp 标记兜底扫描

快速开始

import { combiner, split } from '@/uni_modules/zy-livePhoto'

combiner({
  params: {
    imagePath: '/storage/emulated/0/DCIM/xxx.jpg',
    videoPath: '/storage/emulated/0/DCIM/xxx.mp4'
  },
  complete: (res) => {
    if (res.code == 0) {
      console.log('合成结果', res.data.path)
    } else {
      console.log('失败', res.code, res.message)
    }
  }
})

split({
  params: { path: '/storage/emulated/0/DCIM/xxxMP.jpg' },
  complete: (res) => {
    if (res.code == 0) {
      console.log(res.data.imagePath, res.data.videoPath, res.data.method)
    }
  }
})

API

所有方法都接收 { params, success, fail, complete },三个回调都收到同一结构:

type ZyLivePhotoResult = {
  code: number      // 0 成功,其他为错误码
  data: UTSJSONObject
  message: string
}

requestPermissions

参数 类型 必填 说明
params.permissions string[] 是 需要申请的运行时权限
success / fail / complete function 否 回调

data:{ type: 'onGranted' | 'onDenied', allGranted: boolean, permissions: string[], deniedPermissions: string[] }

注意:申请是异步的,data 反映的是发起弹窗那一刻的授予状态,弹窗结果请在页面 onShow 时再调用一次本方法或 checkAllFilesPermission 获取。

checkAllFilesPermission

无参数,data:{ status: boolean }

toAllFilesPermissionPage

无参数,data:{ status: boolean }(跳转时刻的权限状态;建议 onShow 时重新检查)

combiner

参数 类型 必填 说明
params.imagePath string 是 图片路径,必须是 jpg / jpeg
params.videoPath string 是 视频路径,必须是 mp4
params.saveDir string 否 输出目录,默认 <外部私有目录>/zyLivePhoto/
params.saveName string 否 输出文件名(以 .jpg 结尾),默认 <时间戳>MP.jpg

data:{ path: string }(合成后的文件路径)

split

参数 类型 必填 说明
params.path string 是 实况照片路径,必须是 jpg / jpeg
params.saveDir string 否 输出目录,默认 <外部私有目录>/zyLivePhoto/
params.imageName string 否 静态图文件名,默认 <原名>_still.jpg
params.videoName string 否 视频文件名,默认 <原名>_video.mp4

data:{ imagePath: string, videoPath: string, method: string }(method 为识别方式,便于排查)

权限说明

  • 输出到默认目录(App 私有外部目录)无需任何权限;
  • 输出到公共目录(如 /storage/emulated/0/DCIM)需要:
    • Android 10 及以下:WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE(用 requestPermissions 申请)
    • Android 11+:MANAGE_EXTERNAL_STORAGE(运行时弹窗无法授予,需 toAllFilesPermissionPage 引导用户到系统页面开启)

错误码

错误码 说明
0 成功
9040001 参数错误
9040002 获取上下文失败
9040003 权限未授予
9040004 文件不存在
9040005 文件格式不支持
9040006 合成失败
9040007 分离失败
9040008 不是实况照片
9040009 文件读写失败
9040099 未知错误

已知限制

  • imagePath / videoPath 支持普通路径、file:// 前缀与 content://(后者会先复制到应用缓存目录);
  • 合成后的实况照片请用「相册」类应用查看效果,HBuilderX 预览无法播放。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE android.permission.MANAGE_EXTERNAL_STORAGE

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件仅在本机读写图片与视频文件,不采集、不上传任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。