更新记录

1.0.0(2026-10-28)

  • 新增实况照片与普通图片统一展示组件,支持封面展示、点按播放动态视频和播放结束回到封面。
  • 新增自动播放、单次播放、循环、静音、等比显示与填满模式,以及 play、stop、reload 控制方法。
  • 新增内容流同组互斥播放、active 状态控制,以及滚动、页面隐藏、换源和卸载时的停止与资源释放处理。
  • 新增 Android、iOS、Harmony 系统播放器适配,具体宿主支持范围见使用说明。
  • 新增 App 原生黑底全屏预览,支持图片等比居中、实况播放按钮、普通图预览和关闭入口。
  • 新增 openLivePhotoPreview、closeLivePhotoPreview 与一次性 onClose 回执,支持预览会话管理、重复关闭识别和真实错误反馈。
  • 新增封面加载、视频开始、停止、结束和失败事件,提供请求关联编号及可序列化错误快照。
  • 新增按操作查询的能力检测、统一错误码和有界脱敏诊断快照,明确区分可用能力与未实现业务。
  • 新增 uni-app Vue2/Vue3 与 uni-app x 单页示例,集中提供展示播放、全屏预览和接口诊断。
  • 新增完整诊断报告、一键复制日志、固定快照分段及复制失败的手动回退,保留环境信息、操作记录和错误详情。

平台兼容性

uni-app(5.33)

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

uni-app x(5.33)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ - - √ √ ×

实况照片展示与全屏预览

介绍

lizhao-live-photo 为 uni-app 与 uni-app x 提供实况照片内容流展示和 App 本地媒体全屏预览。传入已有的封面与动态视频,即可实现点按播放、同组互斥、循环、静音,以及黑底全屏查看;普通图片也可使用同一套展示组件。

当前能力集中在展示与预览,不提供系统相册选择、原件识别与提取、拍摄、保存或分享。相关预留接口的可用状态、参数和失败处理统一列在“API 用途速查”,宿主与平台范围见“注意事项”。

功能特色

功能 使用效果 组件 / API
实况与普通图统一展示 实况先显示封面,点按播放动态视频;普通图片只显示封面 lizhao-live-photo、media
播放方式控制 支持单次播放、自动播放、循环、静音,以及等比完整显示或填满 autoplay、loop、muted、objectFit、play/stop/reload
内容流互斥与生命周期 同组只播放一个条目;滚动、页面隐藏、换源和移除时可停止播放 groupId、active、stop/ended/error 事件
App 原生全屏预览 黑底、图片等比居中、左下实况按钮和关闭入口;直接复用已有本地媒体 openLivePhotoPreview({ media })
关闭结果与会话管理 按预览 ID 关闭,区分已关闭、忙碌、超时和结果未知;实际关闭后通知业务 closeLivePhotoPreview、onClose
真实状态与错误回执 封面加载、视频开始、停止、结束及失败均提供事件和关联编号 load/play/stop/ended/error、requestId
能力检测 按操作查询当前状态与原因,调用前判断是否具备预览条件 getLivePhotoCapabilities
完整诊断报告 脱敏记录环境、调用和错误;支持一键复制、固定快照分段及手动复制回退 getLivePhotoDiagnostics、示例底部日志区
双宿主示例 同一页面切换“展示播放 / 全屏预览 / 接口诊断”,共用完整日志 uni-app Vue2/Vue3 与 uni-app x 示例入口

适合哪些场景

场景 推荐用法 使用前提
社区动态、相册列表、作品流 封面点按播放,同一列表用相同 groupId 控制互斥 业务已准备好可访问的封面和动态视频
商品、旅行、生活记录详情 使用静音、循环和显示比例呈现动态瞬间 媒体格式需能被目标平台播放器解码
App 大图与动态片段查看 将列表中的 media 传给原生全屏 API 使用本地可读资源,并已集成匹配的原生基座
普通图与实况混排 统一使用同一组件;普通图不显示实况播放入口 mediaType、isLivePhoto 与资源描述真实一致
客户问题复现与排查 用示例操作复现后复制完整日志报告 保留原始失败与环境信息,复制前自动脱敏

系统相册选取、实况拍摄、原件提取、保存到图库、系统分享及普通视频转实况不在当前可用功能范围内。远端资源的下载、缓存和业务上传由接入方自行处理。

下载与导入

步骤 / 宿主 操作说明
获取插件 将获得的完整插件源码导入项目的 uni_modules,保留组件、原生实现和随包资源;以正式发布后的市场详情页为下载入口
工具链 HBuilderX、uni-app 与 uni-app x 的最低要求以插件清单为准;当前要求 HBuilderX 5.33 及以上
uni-app Vue2 / Vue3 示例入口 uni_modules/lizhao-live-photo/example/uniapp/index.vue
uni-app x 示例入口 uni_modules/lizhao-live-photo/example/uniappx/index.uvue
注册示例 在自己的 pages.json 中注册对应入口,路径去掉 .vue 或 .uvue 后缀,再从首页导航进入;每种宿主只需一个入口
调用 API 从 @/uni_modules/lizhao-live-photo 根入口导入;组件标签为 lizhao-live-photo,由 easycom 识别
App 原生运行 初次接入或原生代码变化后,进行原生联编或制作匹配的自定义基座;iOS 在 Windows 上需要云打包自定义基座
验证与日志 在示例中切换“展示播放 / 全屏预览 / 接口诊断”;底部“一键复制日志”包含完整报告

全屏预览由插件直接呈现,不需要另建预览页面或增加全屏路由。示例的自动播放、静音和循环开关会真实传入 API。普通资源热更新或 WGT 无法把缺失的原生插件加入旧基座,出现 undefined class 时应先核对当前基座是否包含插件。

从基础到进阶:按业务模块使用

模块一:运行内容流展示

先运行“下载与导入”中对应宿主的示例入口,在“展示播放”中核对实况 A/B、普通图、替换、移除恢复和同组停止。以下是可复制到已注册页面的最小组件示例;样本 helper 只提供随包媒体描述,业务接入时将 sample 替换为自己的 LivePhotoMediaItem。

uni-app x 页面:

<template>
  <view>
    <lizhao-live-photo :media="sample" group-id="sample-preview" :active="active"
      @load="viewEvent" @play="viewEvent" @stop="viewEvent"
      @ended="viewEvent" @error="viewEvent" />
  </view>
</template>
<script setup lang="uts">
import { ref } from 'vue'
import { LivePhotoMediaItem, LivePhotoViewEvent } from '@/uni_modules/lizhao-live-photo'
import { getLivePhotoFeedSample } from '@/uni_modules/lizhao-live-photo/example/sample-media.uts'

const sample = ref<LivePhotoMediaItem>(getLivePhotoFeedSample('展示样本'))
const active = ref(true)
function viewEvent(event: LivePhotoViewEvent): void {
  console.log(event.name, event.requestId, event.reason)
  const error = event.error
  if (error != null) console.error(error.errCode, error.errMsg, error.nativeCause)
}
onHide(() => { active.value = false })
onShow(() => { active.value = true })
</script>

uni-app Vue2/Vue3 页面:

<template>
  <view>
    <lizhao-live-photo :media="sample" group-id="sample-preview" :active="active"
      @load="viewEvent" @play="viewEvent" @stop="viewEvent"
      @ended="viewEvent" @error="viewEvent" />
  </view>
</template>
<script>
import { getLivePhotoFeedSample } from '@/uni_modules/lizhao-live-photo/static/sample-media.js'
export default {
  data() { return { sample: getLivePhotoFeedSample('展示样本'), active: true } },
  onHide() { this.active = false },
  onShow() { this.active = true },
  methods: {
    viewEvent(event) {
      console.log(event.name, event.requestId, event.reason)
      if (event.error != null) console.error(event.error.errCode, event.error.errMsg, event.error.nativeCause)
    }
  }
}
</script>

load 只证明封面实际读入,不能证明视频可播放或原件可保存;play 等待视频真实进度或原生首帧。样本没有音轨,切换 muted=false 也不会产生声音。样本的 fixture-display-* 标识不是业务注册句柄,originalResources 为空,不可用于保存、上传或恢复实况。

列表滚动与页面隐藏时应把对应条目的 active 设为 false。uni-app x App 当前没有通用自动可视观察,完整示例用滚动事件停止播放、滚动结束后恢复可点击状态,并在页面隐藏时持续停止;业务应结合自己的列表可见性更新 active。恢复 active 不会自动恢复此前已停止的播放。

模块二:调用 App 原生全屏预览

下面是接收已准备媒体的uni-app x调用函数;下文提供双宿主打开/关闭代码及生命周期说明,完整可运行页面是 uni_modules/lizhao-live-photo/example/uniappx/index.uvue 与 uni_modules/lizhao-live-photo/example/uniapp/index.vue。

import { openLivePhotoPreview, closeLivePhotoPreview, OpenLivePhotoPreviewOptions, LivePhotoMediaItem } from '@/uni_modules/lizhao-live-photo'

let currentPreviewId = ''
let previewPageDisposed = false
function showFullscreen(media: LivePhotoMediaItem): string {
  const options: OpenLivePhotoPreviewOptions = {
    media, autoplay: false, muted: true, loop: false,
    success: (result) => {
      if (previewPageDisposed) {
        closeLivePhotoPreview({ previewId: result.previewId,
          fail: (error) => { console.error(error.errCode, error.errMsg) } })
        return
      }
      currentPreviewId = result.previewId
      console.log('窗口与封面已就绪', result.previewId)
    },
    fail: (error) => { console.error(error.requestId, error.errCode, error.errMsg) },
    complete: (summary) => { console.log(summary.requestId, summary.status) },
    onClose: (event) => {
      if (currentPreviewId == event.previewId) currentPreviewId = ''
      console.log('预览已关闭', event.previewId, event.reason)
    }
  }
  return openLivePhotoPreview(options)
}
function closeFullscreen(): string | null {
  if (currentPreviewId.length == 0) return null
  const id = currentPreviewId
  return closeLivePhotoPreview({
    previewId: id,
    success: (result) => {
      if (currentPreviewId == result.previewId) currentPreviewId = ''
      console.log(result.closed, result.alreadyClosed)
    },
    fail: (error) => { console.error(error.errCode, error.errMsg) },
    complete: (summary) => { console.log(summary.requestId, summary.status) }
  })
}
onUnload(() => { previewPageDisposed = true; closeFullscreen() })

调用前停止列表播放;完整示例会结合页面是否仍可见、是否已卸载、是否仍有预览来恢复active,避免返回或迟到回调重启列表。API默认autoplay=true,上例显式false,让用户点左下实况按钮播放;muted默认true、loop默认false。普通图只展示封面。open的success只表示全屏可见且封面真实加载,不代表视频已播放或实况原件有效;complete是此次打开的终态,onClose是打开成功后实际关闭的一次通知。

media与source恰传一个非空来源;不要给上例再加source。media不执行原件识别、资源注册或远端下载,fixture-display-*仍只是展示关联标识,不可拿来保存/上传。source分支校验后仍返回未实现错误。Web、小程序不提供原生全屏;Harmony提供本地media预览。

普通uni-app Vue2/Vue3可在已有选项式页面使用以下方法;实参media复用业务已有的LivePhotoMediaItem,三个播放开关显式传值。完整生命周期、列表active与日志处理见对应宿主的示例入口。

import { openLivePhotoPreview, closeLivePhotoPreview } from '@/uni_modules/lizhao-live-photo'
export default {
  data() { return { previewId: '', previewDisposed: false } },
  onUnload() { this.previewDisposed = true; this.closePreview() },
  methods: {
    preview(media) {
      return openLivePhotoPreview({
        media, autoplay: false, muted: true, loop: false,
        success: (result) => {
          if (this.previewDisposed) {
            closeLivePhotoPreview({ previewId: result.previewId,
              fail: error => console.error(error.errCode, error.errMsg) })
            return
          }
          this.previewId = result.previewId
        },
        fail: error => console.error(error.errCode, error.errMsg),
        onClose: event => {
          if (this.previewId === event.previewId) this.previewId = ''
        }
      })
    },
    closePreview() {
      if (this.previewId.length === 0) return null
      return closeLivePhotoPreview({
        previewId: this.previewId,
        success: result => { if (this.previewId === result.previewId) this.previewId = '' },
        fail: error => console.error(error.errCode, error.errMsg)
      })
    }
  }
}

模块三:先检查真实能力

在两种宿主页面的脚本中使用相同根入口:

import { getLivePhotoCapabilities } from '@/uni_modules/lizhao-live-photo'

const capability = getLivePhotoCapabilities()
console.log(capability.available, capability.reason)

Android/iOS/Harmony 的能力查询只检测原生全屏预览的呈现宿主:implementation=native-preview,具备有效前台宿主时 available 可为 true,operations 中的 preview 为 available。这不检测文件可读性、空闲状态或原件是否为实况,调用仍可能失败。其他操作为 unavailable,deviceSupport=unknown、permissionsChecked=false。Web/小程序的业务 API 为 contract-only 与 unsupported;Web 组件展示独立于此能力查询。Harmony 也只展示已准备的 media,不识别 MovingPhoto 原件。

模块四:读取诊断与复制完整报告

从插件根入口读取诊断快照。若要包含某次异步调用的终态,在该调用的 complete 中再次读取。

import { getLivePhotoDiagnostics } from '@/uni_modules/lizhao-live-photo'

const diagnostics = getLivePhotoDiagnostics()
console.log(diagnostics.pendingCount, diagnostics.droppedCount)

页面底部“一键复制日志”包含环境、插件诊断和本次会话全部保留记录,并非仅最近8条摘要;缓存上限1000条/1MiB,截断及丢弃会注明。完整报告带报告编号、生成时间/时区、条数、长度和首尾标记。长报告可在同一固定快照上逐段复制,仅实际成功才推进;复制失败显示真实原因及可手动全选的报告/分段,不清空原日志。三个Tab切换不重建报告或清复制位置。包内无法取得的HX/编译器/基座构建版本明确unknown,不用作者电脑信息冒充客户包版本;路径、URL、错误和参数在缓存、显示及复制前脱敏。

模块五:预留选择与权限入口的错误处理

uni-app 普通 Vue 页面可在 methods 中直接执行:

import { chooseLivePhoto } from '@/uni_modules/lizhao-live-photo'

const requestId = chooseLivePhoto({
  count: 9,
  sourceType: ['album'],
  allowNormalImage: true,
  timeoutMs: 120000,
  success(result) { console.log(result.requestId, result.tempFiles.length) },
  fail(error) { console.log(error.errSubject, error.errCode, error.errMsg) },
  complete(summary) { console.log(summary.requestId, summary.status) }
})
console.log('调用已返回', requestId)

uni-app x 页面先建立根导出的 Options 类型:

import { chooseLivePhoto, ChooseLivePhotoOptions } from '@/uni_modules/lizhao-live-photo'

const options: ChooseLivePhotoOptions = {
  count: 9,
  sourceType: ['album'],
  fail: (error) => { console.log(error.errCode, error.errMsg) },
  complete: (summary) => { console.log(summary.requestId, summary.status) }
}
const requestId = chooseLivePhoto(options)
console.log(requestId)

当前合法参数只会异步触发 fail,然后 complete;不会打开相册,不会调用 success。取消入口已提供参数与明确失败合同,尚不取消实际任务;原生实况资源与系统相册回读尚未接入。complete 是终态摘要,媒体成功结果只由 success 提供,不能把它当作 uni.chooseImage 的完整替代返回值。

后续实况结果将同时提供封面兼容路径 tempFilePaths 和完整媒体项 tempFiles。业务发布需保留动态视频、原始资源与关联信息,不能只上传封面;这些结果当前仅有类型合同,尚无生成实现。

权限入口同样保留明确失败处理,当前不会弹出授权窗口:

import { requestLivePhotoPermissions, getLivePhotoDiagnostics } from '@/uni_modules/lizhao-live-photo'

requestLivePhotoPermissions({
  operations: ['choose'],
  fail: (error) => { console.log(error.errCode, error.errMsg) },
  complete: (summary) => { console.log(summary.status) }
})
const diagnostics = getLivePhotoDiagnostics()
console.log(diagnostics.pendingCount)

需要本次失败终态后的诊断时,在 complete 回调中读取快照。

模块六:预留媒体业务的失败处理

下面的 UTS 代码可放在 uni_modules/lizhao-live-photo/example/uniappx/index.uvue 的脚本中按需调用;普通 uni-app 的 uni_modules/lizhao-live-photo/example/uniapp/index.vue 使用相同根 API,可去掉 UTS 类型注解。inspectExistingSource 的 source 必须来自客户实际持有的路径、完整 URI 或本插件后续生成的资源句柄。随包样本仅用于组件/全屏展示,不是inspect、保存或上传的成功业务资源。

import {
  inspectLivePhoto, captureLivePhoto, LivePhotoSource, InspectLivePhotoOptions,
  CaptureLivePhotoOptions
} from '@/uni_modules/lizhao-live-photo'

function inspectExistingSource(source: LivePhotoSource): string {
  const options: InspectLivePhotoOptions = {
    source: source,
    fail: (error) => { console.log(error.requestId, error.errCode, error.errMsg) },
    complete: (summary) => { console.log(summary.status) }
  }
  return inspectLivePhoto(options)
}

const captureOptions: CaptureLivePhotoOptions = {
  lens: 'back',
  audioMode: 'required',
  beforeMs: 1500,
  afterMs: 1500,
  allowPlatformDuration: true,
  fail: (error) => { console.log(error.requestId, error.errCode, error.errMsg) },
  complete: (summary) => { console.log(summary.status) }
}
const captureRequestId = captureLivePhoto(captureOptions)
console.log(captureRequestId)

当前拍摄入口不会打开相机或申请麦克风权限。识别、提取、清单、准备、保存、分享、取消和释放仍先校验,立即返回requestId,再异步fail、complete。传入结构合法的描述不会证明文件存在、配对有效或媒体可播放。全屏预览的media分支已接入App原生,见“调用 App 原生全屏预览”;source分支仍明确不可用。

模块七:安全处理同步 Outcome

下面代码同样只使用插件根入口。先检查 ok,再检查 result/error;不能把返回对象本身当作订阅成功或配置已生效。

import {
  onLivePhotoProgress, offLivePhotoProgress, setLivePhotoDiagnostics,
  LivePhotoProgressEvent
} from '@/uni_modules/lizhao-live-photo'

const subscription = onLivePhotoProgress((event: LivePhotoProgressEvent) => {
  console.log(event.requestId, event.stage, event.progress)
})
const subscribed = subscription.result
if (subscription.ok && subscribed != null) {
  const removal = offLivePhotoProgress(subscribed.subscriptionId)
  console.log(removal.ok)
} else {
  const error = subscription.error
  if (error != null) console.log(error.requestId, error.errCode, error.errMsg)
}

const configuration = setLivePhotoDiagnostics({ level: 'info', includeNativeDetails: false })
const configurationError = configuration.error
if (!configuration.ok && configurationError != null) {
  console.log(configurationError.requestId, configurationError.errCode, configurationError.errMsg)
}

当前这三个同步入口始终返回 ok=false、result=null、非空 error;合法参数得到不可用/不支持错误,非法参数得到参数错误。每次调用有独立的诊断关联 ID,可从 error.requestId 关联日志,但不会创建原生任务。cancelLivePhotoTask、releaseLivePhotoResources 也仍不可用:调用后不影响已排队选择/权限请求的终态,不删除文件,不假装已取消或已释放。

API 用途速查

API 用途 当前结果
getLivePhotoCapabilities 同步查询各操作的实现状态 Android/iOS/Harmony仅preview按宿主检测available;其他操作未实现,不申请权限
chooseLivePhoto 校验选择参数,同步返回 requestId 异步 fail 后 complete;不读取媒体
requestLivePhotoPermissions 校验选择/拍摄/保存所需操作清单 异步 fail 后 complete;不申请权限
getLivePhotoDiagnostics 同步获取脱敏的独立日志快照 包含插件身份、时间、请求、阶段、丢弃数量和未采集边界
inspectLivePhoto 识别已有本地来源是否为实况,区分普通图与无法识别原因 返回 requestId;当前异步失败,不读取来源
extractLivePhoto 从已有来源导出图片、视频或两者 返回 requestId;当前异步失败,不生成文件
getLivePhotoUploadManifest 获取封面、展示视频、原件及关联元数据的上传清单 返回 requestId;当前异步失败;该 API 不负责上传
prepareLivePhotoDisplay 根据本地或远端描述准备受控展示资源 返回 requestId;当前异步失败,不联网、不生成缓存
captureLivePhoto 按镜头、声音和拍摄前后时长请求原生实况捕获 返回 requestId;当前异步失败,不打开相机
openLivePhotoPreview 打开插件原生全屏预览 App的已准备media分支等待窗口可见且封面真实加载后success;source分支仍不可用
closeLivePhotoPreview 关闭指定原生预览 返回requestId;真实回执区分closed/alreadyClosed,未知ID或未知结果明确失败
saveLivePhoto 保存已有资源并按配置核验图库识别与原生回执 返回 requestId;当前异步失败,不写相册
shareLivePhoto 以明确保留策略或显式图片/视频降级交接给系统分享 返回 requestId;当前异步失败,不打开分享界面
cancelLivePhotoTask 请求取消指定异步任务 返回独立 requestId;当前异步失败,不改变目标终态
releaseLivePhotoResources 逐项释放本插件托管资源 返回独立 requestId;当前异步失败,不删除资源
onLivePhotoProgress 同步请求进度订阅 LivePhotoProgressSubscriptionOutcome;当前 ok=false,不注册监听
offLivePhotoProgress 同步请求解除指定订阅 LivePhotoProgressUnsubscribeOutcome;当前 ok=false,不假装已移除
setLivePhotoDiagnostics 同步请求诊断级别和原生详情配置 LivePhotoDiagnosticConfigOutcome;当前 ok=false,不修改配置

内容流组件参数、方法与事件

标签为 lizhao-live-photo。组件原位展示与全屏API分别验收;能力快照只将已接入的App preview按有效宿主返回available,不因组件样本播放改变选择、识别、准备或保存等操作状态。

参数 类型 必填 说明 默认值 可选参数
media LivePhotoMediaItem 或 null 是,可传 null 明确传入的展示媒体;null 清空展示;组件不负责相册选择、识别、下载或业务资源注册 无;Vue 可省略为 null 普通图或已有展示描述
groupId string 否 同组组件互斥播放;不同业务列表应按需要分组 default 业务组标识
playOnTap boolean 否 是否响应点按;false 时可由组件实例方法触发 true true、false
autoplay boolean 否 封面真实加载后尝试播放,受 active、同组仲裁与宿主播放策略限制 false true、false
loop boolean 否 连续循环;循环期间不派发单次结束终态 false true、false
muted boolean 否 展示音量策略,不补造资源音轨 true true、false
objectFit string 否 contain 完整显示,cover 填满并可能裁切 contain contain、cover
active boolean 否 false 停止播放及排队意图;用于可见性和页面生命周期 true true、false

组件实例方法 play()、stop()、reload() 均无参数、无业务成功返回值:分别请求原位播放、停止回封面、重新读取当前来源;应以事件判断实际结果。普通图只加载封面,调用 play 不制造实况。media 替换、清空或组件卸载会失效旧播放代际,迟到回执不能恢复旧条目。

事件 load/play/stop/ended/error 的参数均为 LivePhotoViewEvent,字段是 name/mediaId/resourceId/requestId/reason/error。load 为封面读入,play 为真实视频进度/原生首帧,stop 为停止,ended 为非循环播放实际结束;error 为真实校验、读取、超时、解码或桥接失败。终态保留对应播放的 requestId,不能把 stop/ended/error 误关联到下一次播放。

error 为 null 或可序列化的 LivePhotoErrorSnapshot,不跨视图传递原生异常对象。其 operation 为 preview,包含 errSubject/errCode/errMsg/requestId/stage;可取得的原生安全分类、异常类型和数字错误码进入 nativeType/nativeCause,未采集堆栈明确标为 unknown。浏览器原始错误、媒体路径和 URL 签名不直接进入事件或报告。

通用异步参数与默认值

参数 类型 必填 说明 默认值 可选参数
options 各异步 API 对应 Options 或 null 是 运行函数缺省为 null;null/缺失以参数错误结束;所有回调可省略 null(无效参数) 必填业务字段见下表
timeoutMs number 否 适用于除权限请求外的异步入口;毫秒,1000–600000有限整数;权限入口无此字段 120000 1000–600000
success function 否 对应Result;App全屏打开/关闭已有真实成功路径,其余入口仍未实现成功 无 无
fail function 否 LivePhotoFail,包含 errSubject/errCode/errMsg 和请求上下文 无 无
complete function 否 LivePhotoCompletion 终态摘要,始终在 success/fail 后 无 无

选择、权限、识别、提取与上传清单参数

参数 类型 必填 说明 默认值 可选参数
count number 否 1–9有限整数 9 1–9
sourceType LivePhotoSourceType[] 否 非空且不重复;camera仍未实现 ['album'] album、camera
allowNormalImage boolean 否 后续允许普通图与实况混选 true true、false
requestLivePhotoPermissions.options.operations LivePhotoPermissionOperation[] 是 非空且不重复,按具体操作申请;当前不申请 无 choose、capture、save
inspectLivePhoto.options.source LivePhotoSource 是 指向客户实际来源;结构校验不代表已读取或识别 无 resource、path、uri
extractLivePhoto.options.source LivePhotoSource 是 提取已有资源,不制作新实况 无 resource、path、uri
extractLivePhoto.options.exportType string 否 需要导出的资源种类 both both、image、video
getLivePhotoUploadManifest.options.resourceId string 是 本插件托管资源句柄,1–256字符且无空白/控制符;不可用 mediaId 或相册 ID 替代 无 无

来源与远端展示参数

参数 类型 必填 说明 默认值 可选参数
LivePhotoSource.kind string 是 resource 是插件句柄,path 是路径,uri 是含协议的完整 URI 无 resource、path、uri
LivePhotoSource.value string 是 1–8192字符,无控制字符;resource另按句柄边界,path必须绝对路径,uri必须含scheme://且不接受http/https 无 无
prepareLivePhotoDisplay.options.source LivePhotoDisplaySource 是 本地与远端分支只能择一 无 local、remote
LivePhotoDisplaySource.kind string 是 确定读取哪一分支 无 local、remote
LivePhotoDisplaySource.local LivePhotoSource 或 null 是 kind=local 时非空;kind=remote 时必须为 null 无 无
LivePhotoDisplaySource.remote LivePhotoRemoteMedia 或 null 是 kind=remote 时非空;kind=local 时必须为 null 无 下面远端字段
LivePhotoRemoteMedia.mediaId string 是 客户业务稳定媒体 ID,非空且不超过256字符,不是临时 resourceId 无 无
LivePhotoRemoteMedia.mediaType string 是 普通图或实况,不根据封面自行猜测 无 image、live-photo
coverUrl string 是 HTTPS地址,非空主机,无userinfo,不超过8192字符;当前不下载 无 无
playbackVideoUrl string 或 null 是 实况为同规则HTTPS地址;普通图为 null 无 无
originalResources LivePhotoRemoteOriginalResource[] 是 1–1000项原始资源;Apple/Harmony至少image+video,Android可container或image+video 无 无
protocol LivePhotoProtocol 是 已知协议、普通图 none 或 unknown 无 apple-live-photo、android-motion-photo、harmony-moving-photo、none、unknown
pairing LivePhotoPairingMetadata 是 pairIdentifier可null,有值必须非空;coverTimeMs可null,否则为0至durationMs之间的有限毫秒数 无 无
width、height number 是 正整数像素尺寸 无 无
durationMs number 或 null 是 实况为有限正毫秒数,允许小数;普通图为 null 无 无
LivePhotoRemoteOriginalResource.role string 是 原件用途,不能用播放副本冒充原件 无 image、video、container
LivePhotoRemoteOriginalResource.url string 是 同规则HTTPS原件地址;不把 URL 当本地路径 无 无
mimeType string 是 对应资源的真实 MIME 类型,非空且不超过256字符 无 无
byteSize number 是 正整数真实字节数,必须在JavaScript可安全表示范围内 无 无
sha256 string 或 null 是 未计算为 null;有值必须为64位十六进制摘要 无 无

远端 image 必须 protocol=none 且没有动态视频;live-photo 必须有展示视频并使用三种已知实况协议之一。签名 URL 的查询内容保持原值用于后续请求,不进入日志。上述检查只确认声明结构;HTTPS外形、角色齐全或摘要格式合法都不证明网络可达、真实字节匹配、格式正确或配对有效,后续必须按实际下载与原生识别结果核验。

拍摄与预览参数

参数 类型 必填 说明 默认值 可选参数
captureLivePhoto.options.lens string 否 期望镜头 back back、front
audioMode string 否 required 要求真实音轨;muted 明确静音 required required、muted
beforeMs、afterMs number 否 捕获触发前后时长,1–10000有限整数毫秒 各1500 1–10000
allowPlatformDuration boolean 否 允许返回平台实际片段长度;实际值必须单独报告 true true、false
openLivePhotoPreview.options.media LivePhotoMediaItem 或 null 与source恰选一个 已准备本地封面/动态片段的展示项,可复用内容流item;不识别原件或注册资源 无 image、live-photo
openLivePhotoPreview.options.source LivePhotoSource 或 null 与media恰选一个 保留原source合同;校验后当前仍不可用,不自动把路径变成media 无 resource、path、uri
autoplay boolean 或 null 否 打开预览后是否自动播放;省略或null使用默认值 true true、false、null
muted boolean 或 null 否 预览静音策略;省略或null使用默认值 true true、false、null
loop boolean 或 null 否 预览循环策略;省略或null使用默认值 false true、false、null
onClose function 否 LivePhotoPreviewClosedEvent;仅打开成功后实际关闭时调用一次,区别于success/complete与播放结束 无 reason见下文
closeLivePhotoPreview.options.previewId string 是 从真实open成功结果取得;1–256字符且无空白/控制符 无 无

media至少提供非空mediaId/resourceId、coverPath及明确mediaType/isLivePhoto:live-photo要求非空videoPath,image要求isLivePhoto=false、videoPath=null。传入完整LivePhotoMediaItem,不把描述合法当成原件已鉴定;App只处理可访问本地资源。open/close的timeoutMs均默认120000毫秒,范围1000–600000有限整数。

onClose事件包含previewId、resourceId、mediaId、reason,reason为user/api/background/destroyed/error。用户退出、程序关闭、后台和宿主销毁均停止并释放预览;播放结束只回封面,不等于关闭。打开前便关闭走9346004的fail及complete(cancelled),不再派发onClose。成功打开后的播放错误进入Native状态诊断,不重新完成原open。

保存、分享、取消与释放参数

参数 类型 必填 说明 默认值 可选参数
saveLivePhoto.options.source LivePhotoSource 是 已有完整来源;不根据封面重建丢失实况 无 resource、path、uri
verifyAlbum boolean 否 要求保存后核验相册资源;不能以文件存在代替识别 true true、false
shareLivePhoto.options.source LivePhotoSource 是 需要交接的已有来源 无 resource、path、uri
preserveLivePhoto boolean 否 true 优先保留实况;false 时必须选择 image/video 降级 true true、false
fallback string 否 true与显式image/video组合允许保留失败后明确降级;none禁止静默降级 none none、image、video
cancelLivePhotoTask.options.targetRequestId string 是 被取消任务ID,1–256字符且无空白/控制符;取消调用另有自己的ID 无 无
releaseLivePhotoResources.options.resourceIds string[] 是 1–1000个不重复插件句柄,每个1–256字符且无空白/控制符;不包含客户原件所有权 无 无

同步控制参数

参数 类型 必填 说明 默认值 可选参数
onLivePhotoProgress.listener LivePhotoProgressCallback 或 null 是 回调接收 LivePhotoProgressEvent;null 无效;当前不注册 无 无
offLivePhotoProgress.subscriptionId string 或 null 是 真实订阅标识,1–256字符且无空白/控制符;null无效;当前无成功订阅可解除 无 无
setLivePhotoDiagnostics.options LivePhotoDiagnosticConfigOptions 或 null 是 null无效;空对象使用字段默认值,但当前配置仍不可用 null(无效参数) 下列配置字段
level string 否 后续诊断输出级别;当前不修改基础快照行为 info error、info、debug
includeNativeDetails boolean 否 后续更深原生诊断开关;不允许采集敏感内容 false true、false

返回值、回调与类型

13个异步入口同步返回本次唯一requestId,随后异步派发结果。success/fail互斥且各至多一次,complete随后至多一次;回调抛错隔离并记录安全分类,complete仍执行。非法参数优先9346001。尚未实现的业务和预览source分支,合法参数在App仍9346003、Web/小程序9346002;App预览media/关闭分支则按真实Native回执返回。

LivePhotoCompletion包含errSubject、errCode、errMsg、operation、requestId、status;status为success/failed/cancelled/unknown。App全屏可实际产生成功、失败、打开前取消和关闭结果未知;其他未实现入口仍failed。每个成功Result含errMsg与requestId;除全屏打开/关闭外,下表成功字段仍为后续合同,不代表已生成资源。

API 对应 Result 除 errMsg/requestId 外的字段 关键语义
ChooseLivePhotoResult tempFilePaths、tempFiles 封面兼容路径与完整媒体项分别保存
LivePhotoPermissionResult permissions 每项 name 与 granted/denied/limited/not-checked/unsupported 状态
InspectLivePhotoResult isLivePhoto、media或null、reason 普通图与不能识别原因不能混为实况成功
ExtractLivePhotoResult resourceId、files files 为原始资源项,不改写客户输入
GetLivePhotoUploadManifestResult manifest schemaVersion=1,清单本身不执行上传
PrepareLivePhotoDisplayResult media 受控展示媒体;后续下载/准备必须真实完成
CaptureLivePhotoResult media、captureMode、actualBeforeMs、actualAfterMs 返回真实捕获方式与实际毫秒数
OpenLivePhotoPreviewResult previewId、resourceId、mediaId 成功呈现后的真实预览ID;媒体ID沿用输入,不因此注册业务资源
CloseLivePhotoPreviewResult previewId、closed、alreadyClosed 本次关闭为true/false,此前已关闭为false/true;不得把未知状态伪造为已关闭
SaveLivePhotoResult assetId或null、uri或null、protocol、nativeReceipt或null、verification verification为verified/not-verified;原生提交与图库识别分层
ShareLivePhotoResult handoff、representation、preserved、receiverVerified 交接为submitted/cancelled/unknown;表示为live-photo/image/video;交接不证明接收方仍为实况
CancelLivePhotoTaskResult targetRequestId、accepted、state state为cancellation-requested/already-settled/unknown;accepted不等于目标已经取消
ReleaseLivePhotoResourcesResult items 每项resourceId、released、reason;逐项报告实际释放结果

LivePhotoMediaItem 包含 resourceId、mediaId、path、coverPath、size、mediaType、isLivePhoto、videoPath、videoByteSize、durationMs、width、height、hasAudio、protocol、temporary、originalResources、pairing;path/coverPath 是封面兼容路径。LivePhotoOriginalResource 包含 role、path、mimeType、byteSize、sha256。字节、像素、毫秒各用对应单位,未知的可空字段返回 null。resourceId 是进程管理的本地句柄,不是 mediaId、assetId 或远端 URL。

LivePhotoUploadManifest 包含 schemaVersion、resourceId、mediaId、mediaType、protocol、pairing、width、height、durationMs、cover、playbackVideo、originalResources。cover 是必有封面描述;playbackVideo 可为 null;originalResources 保存原件,不因已上传展示视频而删除。客户上传完成后自行构造 LivePhotoRemoteMedia,业务存储和上传服务不由本插件提供。

同步 Outcome 都有 ok、result、error,error 为 LivePhotoErrorSnapshot。后续成功时订阅结果含 subscriptionId,解除结果含 subscriptionId/removed,诊断配置结果含 level/includeNativeDetails;当前全部 ok=false、result=null,错误优先级与异步入口一致。这三个调用不会抛出业务错误,不通过 success/fail/complete 派发结果,也不创建原生任务。

LivePhotoProgressEvent 包含 requestId、operation、stage、timeMs、progress、completedBytes、totalBytes;timeMs为真实事件时间,progress为0–1比例,未知进度/字节数为null。当前无订阅成功或业务进度事件。LivePhotoViewOptions/LivePhotoViewEvent用于内容流展示;组件事件、业务进度订阅和全屏的一次性onClose互相独立。

页面保存错误时可使用根入口导出的 LivePhotoErrorSnapshot 对象类型。LivePhotoFail 是插件内部错误实现接口,uvue 不直接导入该 interface 或对它做 instanceof。字段、参数、终态与资源约束见本节各表,原生接入要求见“注意事项”。

诊断默认最多1000条、1MiB估算预算,覆盖/丢弃累计droppedCount,快照独立于内部缓存。App诊断implementation为native-preview,entries记录全屏Native固定状态、打开/关闭终态及关闭原因;原生权限、完整堆栈和SDK快照未采集时明确unknown。两种宿主的单页示例把组件事件、全屏回调与关闭状态汇入完整报告。插件版本从package.json校验,客户包HX、编译器、基座等未知时保留unknown与来源。

全屏最多一个原生会话;重复打开可返回9346010。关闭成功ID由原生保留近期记录用于幂等(Android/iOS最近64项,Harmony最近32项),历史淘汰或跨进程后不能承诺alreadyClosed;未知ID为9346015。UTS关闭等待不到回执为9346016、complete(unknown),不能当作已关闭或盲目重开;Native能确认仍可见的关闭超时可返回9346009。详细恢复条件见“调用 App 原生全屏预览”小节。

错误码说明

errSubject固定为 lizhao-live-photo。未实现业务仍主要返回参数/不支持/未实现错误;组件和App全屏可实际产生读取、取消、忙碌、超时、解码、桥接、未知预览ID及结果未知。标为保留的业务错误不表示对应能力已实现。

错误码 含义 处理建议
9346001 参数无效 检查必填项、类型、数量、重复项和时间范围
9346002 当前平台不支持 Web/小程序业务入口不提供原生实况能力;Web仅提供组件展示适配
9346003 原生能力尚未实现 预览source分支及其他未实现App业务;Harmony相册选择、识别、拍摄、保存等同样尚未实现
9346004 用户取消 全屏打开前退出走fail及complete(cancelled);打开后的用户关闭走onClose(user)
9346005 权限拒绝/撤销(保留) 后续按具体权限状态引导用户
9346006 资源读取失败 组件/全屏可实际返回;核对本地封面、视频、授权与可访问性
9346007 格式不支持/文件损坏(保留) 保留原件并核对真实格式
9346008 配对资源不完整(保留) 不能只提交封面或静默当普通图成功
9346009 超时 组件准备/首帧、全屏打开或Native确认仍可见的关闭超时;保留真实界面状态
9346010 交互忙碌 全屏已有会话时不重复打开;等待实际关闭,不盲目重试
9346011 空间不足(保留) 释放业务允许清理的空间
9346012 解码/编码失败 组件可实际返回播放/解码失败;根据格式、设备和安全原生分类排查
9346013 保存失败(保留) 核对权限、事务回执和图库识别
9346014 桥接失败 组件绑定、停止或释放失败可实际返回;资源状态未知时停止重入,核对匹配基座
9346015 资源失效/归属不符 当前全屏未知previewId可实际返回;历史淘汰不伪造已关闭
9346016 结果未知 全屏关闭无回执时complete(unknown),先核对界面;后续保存同样避免重复副作用
9346017 分享不能保留实况(保留) 后续由业务明确选择视频/图片降级
9346018 请求标识冲突(保留) 依据本次请求身份关联回调

注意事项

宿主与平台范围

下表的支持范围仅指已有封面/视频的展示和预览,不包含系统相册、原件识别、拍摄、保存或分享。清单中“√”表示对应范围支持,“-”表示仍需验证,“x”表示不支持。

宿主 / 运行端 展示与预览方式 支持范围
uni-app x Vapor iOS 原生 AVPlayer 内容流与 App 全屏预览 iOS 真机测试已确认可用;需匹配的自定义基座,不能推广为所有设备、编码和异常路径已验
uni-app x Vapor Harmony 原生 AVPlayer 内容流与 App 全屏预览 已完成单台真机的封面、播放、停止、全屏与关闭回执验证;不识别 MovingPhoto 原件
uni-app x Vapor Android 原生 MediaPlayer 内容流与 App 全屏预览 原生编译及独立测试包已验证;完整宿主与匹配基座仍待验证,清单标记为不确定
uni-app Vue2 / Vue3 App 图片/视频内容流适配与原生全屏接口 已有资源编译验证;完整 Android / iOS / Harmony 宿主真机仍待验证,清单标记为不确定;Vue2 Harmony还需相应编译环境
uni-app Vue2 / Vue3 Web、uni-app x Web(Chrome) 图片/视频组件展示 已验证样本原位播放、同组切换、循环和单次结束;原生全屏 API 不支持,Safari 尚未验证
uni-app x 原生 VDOM 原生视图适配 完整调用链尚未验证,不沿用 Vapor 的验收结果
微信 / 支付宝及其他小程序 不声明支持 业务 API 返回明确不支持;组件未完成平台验收

资源、权限与生命周期

  • 组件与 App 全屏读取显式传入的封面/视频。App 使用本地可读资源,接入方负责资源来源、访问授权、远端下载和缓存;播放成功不能证明原件具有有效实况配对,也不能直接用于保存或恢复实况。
  • 展示能力不自动扫描相册,不额外申请照片、相机、麦克风或存储权限,不自动上传媒体或日志。系统相册、拍摄和保存的权限接口仍未实现,不能用它们申请授权。
  • 使用 Android/iOS/Harmony 系统播放器,没有第三方播放器 SDK 依赖;文件格式、编码、系统版本与实际设备能力仍需匹配。随包视频没有音轨,不能用它验证真实音轨的静音效果,也不承诺任意品牌图库或分享渠道兼容。
  • 列表滚动或页面隐藏时将 active 设为 false;全屏打开前停止列表播放,实际关闭后再按页面状态恢复交互。换源、移除与卸载时保留停止/释放和错误处理;恢复 active 不会自动重播。
  • 初次接入、更改原生 UTS、依赖或配置后,必须原生联编或重打自定义基座。appResource/WGT 只能更新资源,不能替换旧包中的原生实现;出现入口类缺失先核对基座是否包含本插件。
  • 全屏关闭无回执时可能返回 9346016 与 complete(unknown),先核实界面状态,不把结果未知当作关闭成功,不盲目重开或重复操作。
  • 上传展示媒体时应由业务保留原始配对资源与关联信息;封面、展示视频和插件资源句柄不可相互替代。

预留接口与 iOS 参数限制

相册选择、识别、提取、上传清单、展示准备、拍摄、保存、分享、任务取消和资源释放接口仍未实现。进度订阅、解除订阅和诊断配置也仍返回失败 Outcome;组件自身的播放事件、原生资源释放和基础诊断不依赖这些预留入口。

iOS 的 Vue2 全屏调用应显式传入 autoplay、muted、loop,避免原生代理的缺省布尔值改变预期;uni-app x Vapor/Vue3 已配置默认值拦截。原生 VDOM 直接调用仍待验证。iOS 预留进度接口的缺省/null listener 在代理中可能被包装为闭包,参数错误的区分仍待验证;该业务入口保持不可用。

日志与验收边界

示例底部提供完整日志、固定快照分段和复制失败时的手动回退。报告的 unknown 表示信息未取得,不能当作检测成功;日志默认脱敏,不包含客户媒体内容,复制由用户主动触发。

平台表中的真机结果不代表其他设备、完整业务链或所有异常路径已验收。系统剪贴板完整回读、长报告分段重组和复制失败的设备路径仍需单独验证;Harmony 已取得一键复制的真实系统 API 成功回执。接入自己的项目后,应按实际宿主验证播放、关闭、错误和报告内容。

作者系列 UTS 插件

以下为作者已发布的其他 UTS 插件,可按能力方向查找。

插件 能力方向 插件市场
lizhao-app-keepalive 应用保活、唤醒、自愈与报告 查看插件
lizhao-bg-audio 背景音频播放、队列、倍速与事件 查看插件
lizhao-ble BLE 扫描、连接、读写、通知与自动重连 查看插件
lizhao-call-kit 电话、短信、通讯录原生能力 查看插件
lizhao-camera-pro 原生相机、拍照录像、水印与媒体保存 查看插件
lizhao-cast-screen DLNA 投屏、AirPlay 路由入口 查看插件
lizhao-choose-file 原生文件选择、上传、进度与取消 查看插件
lizhao-device-id 设备标识、隐私策略与诊断 查看插件
lizhao-doc-corrector 文档扫描、矫正、增强与识别 查看插件
lizhao-emu-detect 模拟器环境检测、风险评分与证据 查看插件
lizhao-float-window 悬浮窗、画中画、权限与诊断 查看插件
lizhao-gallery-pro 相册媒体分页、筛选、缩略图与导出 查看插件
lizhao-hce-card NFC 虚拟卡、APDU 交互与 NDEF 标签模拟 查看插件
lizhao-health 健康数据授权、查询、统计与写入 查看插件
lizhao-http-server 本地 HTTP 服务、文件传输与实时通信 查看插件
lizhao-icon-pro SVG 图标组件、多主题与缓存 查看插件
lizhao-id-photo 证件照制作、尺寸换算、换底色与模板换装 查看插件
lizhao-img-eraser 图片去水印、局部修复与原生编辑器 查看插件
lizhao-live-activity 实时活动、系统胶囊与普通通知降级 查看插件
lizhao-nfc-pro NFC 标签读写、NDEF、IsoDep 与诊断 查看插件
lizhao-notify-pro 本地通知、点击动作、进度与定时提醒 查看插件
lizhao-novel-reader 原生小说阅读、仿真翻页与段落评论 查看插件
lizhao-office-view Office 与 PDF 文件预览、进度与缓存管理 查看插件
lizhao-pdf-pro PDF 阅读、签批、真实写回与页面处理 查看插件
lizhao-scan-pro 原生扫码、连续扫码、相册识别 查看插件
lizhao-serial-port 路径串口、USB 串口、多会话收发与诊断 查看插件
lizhao-share-plus 系统分享、远程文件下载后分享 查看插件
lizhao-smart-tts 系统 TTS、云端合成、听书方案 查看插件
lizhao-sqlite-pro 原生 SQLite、迁移、备份与诊断 查看插件
lizhao-sse-pro SSE、Line、JSONL 与 Raw 流式请求 查看插件
lizhao-tcp-pro TCP 客户端、服务端、多连接与诊断 查看插件
lizhao-usb-storage U 盘、移动硬盘文件浏览、读写与批量复制 查看插件
lizhao-video-editor 视频裁剪、压缩、取帧与 FFmpeg/FFprobe 查看插件
lizhao-video-feed 短视频上下滑、短剧选集与分页加载 查看插件
lizhao-video-player 原生视频播放器、清晰度与播放交互 查看插件
lizhao-video-thumb 视频封面、批量取帧与 Base64 返回 查看插件
lizhao-vpn-pro 企业 VPN、IKEv2、安全接入与脱敏诊断 查看插件
lizhao-wechat-kit 微信登录、分享、支付、小程序与客服 查看插件

隐私、权限声明

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

组件及App全屏读取已有可访问展示资源,不额外申请照片、相机、麦克风或存储权限;业务权限入口仍明确不可用。

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

内容流与App全屏预览按显式传入的可访问封面和视频读取展示,不识别原件、不扫描相册。仅本地缓存脱敏诊断,不自动上传媒体或日志。

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

无

暂无用户评论。