更新记录
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 级识别策略,依次为:
- 华为尾部信息(最后 40 字节内的
LIVE_<长度>) - 小米
GCamera:MicroVideoOffset - Google
Container:Item的Item:Length(MotionPhoto 语义) - 按
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引导用户到系统页面开启)
- Android 10 及以下:
错误码
| 错误码 | 说明 |
|---|---|
| 0 | 成功 |
| 9040001 | 参数错误 |
| 9040002 | 获取上下文失败 |
| 9040003 | 权限未授予 |
| 9040004 | 文件不存在 |
| 9040005 | 文件格式不支持 |
| 9040006 | 合成失败 |
| 9040007 | 分离失败 |
| 9040008 | 不是实况照片 |
| 9040009 | 文件读写失败 |
| 9040099 | 未知错误 |
已知限制
imagePath/videoPath支持普通路径、file://前缀与content://(后者会先复制到应用缓存目录);- 合成后的实况照片请用「相册」类应用查看效果,HBuilderX 预览无法播放。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 62
赞赏 0
下载 12730669
赞赏 1959
赞赏
京公网安备:11010802035340号