更新记录
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 |
微信登录、分享、支付、小程序与客服 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12724099
赞赏 1958
赞赏
京公网安备:11010802035340号