更新记录
1.0.10(2026-07-30)
- 新增
getGalleryMetadata,支持按媒体 ID 批量读取图片 EXIF 与视频标准化元数据。
- 图片元数据支持方向、拍摄时间、相机厂商、相机型号、镜头、ISO、曝光时间、光圈和焦距等字段;视频元数据支持方向、时长、编码格式(codec)、码率(bitrate)和帧率(frameRate)等字段。
- GPS 默认关闭;仅在业务方显式传入
includeLocation=true 时读取位置信息;插件不进行逆地理编码。
- 位置信息不会缓存、记录或上传;元数据缓存仅保存非敏感字段。
- Harmony、Web、微信小程序和支付宝小程序暂不支持元数据读取,调用时明确返回错误码
9070031,不会伪造成功。
clearGalleryCache 新增 metadata 范围,可单独清理非敏感元数据缓存。
- 修复 iOS 云打包时有限数校验中的
-Infinity 被生成成对 NSNumber 使用一元负号,导致 SwiftCompile 报错的问题。
- iOS 元数据数值校验改用
Number.isFinite,继续过滤 NaN 与正负无穷值,不改变公开 API 和 Android 行为。
- Android 原生实现已变更,升级后需重新制作 Android 自定义基座并安装;仅更新页面资源不能带入本次能力。
- iOS 原生实现与 UTS 生成兼容性已变更,升级后需重新制作 iOS 自定义基座并安装;仅更新页面资源不能带入本次能力和修复。
1.0.9(2026-07-30)
- 修复 HBuilderX 5.15 下 iOS 页面回调被桥接为不同具体闭包类型时,统一动态强转可能造成首次结果回调或精确变化监听闪退的问题;各 API 现在按公开结果类型派发成功、失败、进度和变化回调。
- 修复 iOS 原生缩略图与导出文件仅返回沙盒绝对路径,导致页面不能显示封面或预览的问题;插件现在区分页面缓存路径与原生上传路径。
- uni-app 使用
_doc 页面缓存路径,uni-app x 使用 unifile://cache;原生读写、上传、保存与缓存清理继续使用对应绝对路径。
- 示例页媒体列表支持点击全屏预览:图片先导出完整文件后调用系统图片预览,视频先导出完整文件后进入原生
video 全屏播放器。
- 自动读取列表仅更新选中状态,不会自动弹出全屏;预览准备期间会阻止重复导出,页面离开后不再触发延迟播放。
- 本版修改了 iOS 原生桥接与 UTS 平台实现,发布和真机复验前必须重新原生联编或重新制作 iOS 自定义基座;仅更新页面资源不能带入本次原生修复。
1.0.8(2026-07-29)
- 修复 iOS 云打包时精确相册监听的
fail 回调使用协议型参数,导致 Swift 无法推断闭包参数类型的问题。
- 修复
PHAuthorizationStatus.limited 未完全隔离到 iOS 14 可用域,导致最低支持 iOS 12 时的 Swift availability 编译错误。
- 本次仅调整 iOS 生成兼容性,不改变公开 API、回调语义和 Android 行为;升级后需重新原生联编或制作 iOS 自定义基座。
查看更多
平台兼容性
uni-app(5.07)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
× |
× |
√ |
√ |
6.0 |
√ |
× |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| × |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
uni-app x(5.07)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| × |
× |
6.0 |
√ |
× |
× |
lizhao-gallery-pro
lizhao-gallery-pro 是面向 uni-app / uni-app x 的相册媒体 UTS 插件,授权后可读取系统相册图片和视频,并提供分页、筛选、缩略图、导出临时文件、批量保存到系统相册、来源分类和上传辅助。
联系方式:信-微:l-z-1-8-7-1512-5421(-去掉,不这样写会被和谐)
功能特色
- 相册变化实时监听:Android 与 iOS 原生监听系统相册变化,支持防抖、多监听器和回到前台后的补偿刷新。
-
| 批量保存到系统相册:将业务生成或插件导出的本地图片、视频按输入顺序保存到默认或自定义相册,并返回逐项进度和明细。 |
能力 |
解决的问题 |
对应 API |
| 图片、视频、混合列表 |
不弹系统选择器,授权后直接读取相册媒体列表 |
getGalleryImages / getGalleryVideos / getGalleryMedia |
| 分页读取 |
大图库不会一次性塞满内存,可用 nextPageToken 循环读取下一页 |
pageSize / pageToken |
| 时间筛选 |
只读取最近一天、最近一周或指定时间段内的媒体 |
startTime / endTime |
| 来源分类 |
识别相机、截图、微信、QQ、下载等来源,方便做相册入口和筛选 |
sourceType / sourceLabel |
| 相册分组 |
返回相册数量、图片/视频数量、封面和最新媒体信息 |
getGalleryAlbums |
| 缩略图 |
列表先显示小图,减少原图加载压力 |
getGalleryThumbnails |
| 临时文件导出 |
把系统媒体导出成页面可显示、接口可上传的路径 |
exportMediaToTempFile |
| 上传辅助 |
内置导出、上传、dry-run 校验、进度、重试和结果顺序对齐 |
uploadGalleryMedia |
| 批量保存 |
把本地图片、视频混合批量写入系统默认或自定义相册,可选择跳过可见重复项 |
saveMediaToGallery |
| 隐私安全的元数据 |
按媒体 ID 批量读取图片 EXIF、视频参数,并由调用方显式决定是否读取位置 |
getGalleryMetadata |
| 缓存清理 |
缩略图、导出、增量游标和非敏感元数据缓存可以分开清理 |
clearGalleryCache |
| 能力矩阵 |
先判断平台能力,再决定是否展示业务入口 |
getGalleryCapabilities |
适合哪些场景
- 社区发帖、评价晒单、工单上报,需要从相册读取图片或视频。
- 素材库、云盘、相册备份,需要分页读取大量本地媒体。
- 内容审核、巡检记录、设备报修,需要按相机、截图、微信、QQ、下载等来源做分类。
- 自定义相册选择器,需要自己做 UI、分页、封面、预览和上传。
- iOS 页面需要稳定显示相册图片,不能直接依赖不可访问的原始资产路径。
- 上传前需要先生成可上传路径,或用
dryRun=true 在无服务端时验证导出链路。
接入方式怎么选
| 业务需求 |
推荐方式 |
说明 |
| 只判断入口能不能用 |
checkGalleryPermission |
不主动弹权限,只返回当前授权状态 |
| 首次进入时申请权限 |
requestGalleryPermission |
Android / iOS 按当前系统版本请求相册权限 |
| 只要图片 |
getGalleryImages |
图片选择器、相册备份、图片上传 |
| 只要视频 |
getGalleryVideos |
视频素材库、短视频投稿、视频上传 |
| 图片和视频一起获取 |
getGalleryMedia({ mediaType: 'all' }) |
混合素材列表 |
| 做相册分组页 |
getGalleryAlbums |
相册入口、来源分类、封面展示 |
| 列表显示封面 |
getGalleryThumbnails |
九宫格、瀑布流、素材管理 |
| 需要页面预览或上传 |
exportMediaToTempFile |
使用 renderPath 显示,使用 uploadPath 上传 |
| 直接上传相册文件 |
uploadGalleryMedia |
支持并发、重试、进度和 dryRun |
| 保存业务生成的本地媒体 |
saveMediaToGallery |
支持图片/视频混合批量保存、自定义相册和可见判重 |
| 读取拍摄或视频参数 |
getGalleryMetadata |
默认不读取 GPS,可按 ID 批量读取并保留输入顺序 |
| 控制缓存占用 |
clearGalleryCache |
可单独清理缩略图、导出、增量游标或元数据缓存 |
最小示例
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
// 第一步:先检查权限。success / fail / complete 都会按调用结果触发。
GalleryPro.checkGalleryPermission({
mediaType: 'all',
success(res) {
console.log('相册权限状态', res.status, res.message)
if (!res.granted) {
// 第二步:未授权时再请求权限,避免一进页面就打扰用户。
GalleryPro.requestGalleryPermission({
mediaType: 'all',
success(auth) {
console.log('授权结果', auth.granted, auth.status)
}
})
}
},
fail(err) {
console.log('权限检查失败', err.errCode, err.errMsg)
}
})
媒体元数据最小示例
先从列表取得稳定媒体 ID,再按需读取单项元数据。GPS 默认关闭,只有把 includeLocation 显式设为 true 才会读取位置。
import { getGalleryMetadata } from '@/uni_modules/lizhao-gallery-pro'
getGalleryMetadata({
ids: ['media-id-1'],
// 不传 includeLocation,默认 false,不读取敏感位置。
success(res) {
console.log('媒体元数据读取结果', res.success, res.items[0].message)
},
fail(err) {
console.log('元数据批次无法启动', err.errCode, err.errMsg)
}
})
批量读取允许部分成功,items 始终与 ids 输入顺序一致;每处理完一项会触发一次 progress。
import { getGalleryMetadata } from '@/uni_modules/lizhao-gallery-pro'
getGalleryMetadata({
ids: ['media-id-1', 'media-id-2'],
includeExif: true,
includeLocation: false,
progress(event) {
console.log('元数据进度', event.current, event.total, event.successCount, event.failCount)
},
success(res) {
console.log('成功数、失败数', res.successCount, res.failCount)
res.items.forEach((item, index) => {
console.log('输入序号与媒体ID', index, item.id, item.success, item.message)
})
},
fail(err) {
console.log('元数据批次无法启动', err.errCode, err.errMsg)
}
})
getGalleryMetadata(options)
按稳定媒体 ID 批量读取标准化元数据。支持 uni-app 与 uni-app x 的 Android / iOS;批次启动后允许单项失败,最终仍通过 success 返回有序明细。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryMetadataOptions |
是 |
元数据读取参数对象 |
无 |
ids / includeExif / includeLocation / useCache / progress / success / fail / complete |
| options.ids |
Array<string> |
是 |
稳定媒体 ID 列表,必须为 1~100 个且不得重复 |
无 |
1~100 个不重复 ID |
| options.includeExif |
boolean |
否 |
是否读取图片 EXIF;视频不返回图片 EXIF 字段 |
true |
true / false |
| options.includeLocation |
boolean |
否 |
是否读取敏感位置;只有显式为 true 时才读取 |
false |
true / false |
| options.useCache |
boolean |
否 |
是否复用非敏感元数据缓存;位置永不从缓存返回 |
true |
true / false |
| options.progress |
function |
否 |
每处理完一个媒体触发一次 |
无 |
无 |
| options.success |
function |
否 |
批次完成后触发,允许部分成功,查看 items 单项状态 |
无 |
无 |
| options.fail |
function |
否 |
参数、权限或任务队列无法启动时触发 |
无 |
无 |
| options.complete |
function |
否 |
成功或失败后均触发一次 |
无 |
无 |
GalleryMetadataResult
| 字段 |
类型 |
说明 |
| success |
boolean |
是否全部媒体均读取成功;部分成功时为 false |
| successCount |
number |
读取成功的媒体数量 |
| failCount |
number |
读取失败的媒体数量 |
| items |
Array<GalleryMetadataItem> |
与输入 ids 顺序一致的逐项结果 |
| message |
string |
中文汇总说明 |
GalleryMetadataProgress
| 字段 |
类型 |
说明 |
| current |
number |
已处理数量,从 1 递增 |
| total |
number |
本批次媒体总数 |
| successCount |
number |
当前已成功数量 |
| failCount |
number |
当前已失败数量 |
| currentId |
string |
当前处理的媒体 ID |
GalleryMetadataItem
| 字段 |
类型 |
说明 |
| id |
string |
稳定媒体 ID |
| success |
boolean |
当前媒体是否读取成功 |
| mediaType |
GalleryMediaType |
媒体类型:image / video |
| width / height |
number |
像素宽度和高度,未知为 0 |
| durationMs |
number |
视频时长,单位毫秒;图片和未知值为 0 |
| orientation |
number |
EXIF 方向值 1~8,未知为 0 |
| captureTime |
number |
拍摄时间,毫秒时间戳;未知为 0 |
| cameraMake |
string |
相机厂商,未知为空字符串 |
| cameraModel |
string |
相机型号,未知为空字符串 |
| lensModel |
string |
镜头型号,未知为空字符串 |
| iso |
number(可选) |
ISO 感光度,未知时省略 |
| exposureTime |
number(可选) |
曝光时间,单位秒,未知时省略 |
| aperture |
number(可选) |
光圈值,未知时省略 |
| focalLength |
number(可选) |
焦距,单位毫米,未知时省略 |
| focalLength35mm |
number(可选) |
35 毫米等效焦距,未知时省略 |
| videoCodec |
string |
视频编码名称,图片或未知为空字符串 |
| videoBitrate |
number(可选) |
视频码率,单位 bit/s,图片或未知时省略 |
| videoFrameRate |
number(可选) |
视频帧率,单位 fps,图片或未知时省略 |
| locationAvailable |
boolean |
本次调用是否读取并返回了位置;includeLocation 未显式为 true 或位置不可读时为 false,因此 false 不能用于判断原媒体没有 GPS |
| location |
GalleryMediaLocation(可选) |
仅 includeLocation: true 且位置可读时返回 |
| fromCache |
boolean |
非敏感字段是否来自缓存 |
| errCode |
GalleryErrorCode(可选) |
单项错误或诊断码;success=true 也可能携带非致命 9070032,表示缓存读写失败但原始媒体读取成功 |
| message |
string |
中文单项结果说明 |
GalleryMediaLocation
| 字段 |
类型 |
说明 |
| latitude |
number |
纬度,仅在显式允许读取位置时返回 |
| longitude |
number |
经度,仅在显式允许读取位置时返回 |
| altitude |
number(可选) |
海拔,单位米,媒体未提供时省略 |
图片与视频字段差异
| 媒体类型 |
可读取字段 |
说明 |
| 图片 |
宽高、方向、拍摄时间、相机/镜头、ISO、曝光、光圈、焦距、图片 EXIF 位置 |
includeExif: false 时跳过图片 EXIF;位置仍必须显式开启 |
| 视频 |
宽高、方向、时长、codec、bitrate、frameRate、系统资产位置 |
视频位置来自系统媒体资产,不从视频画面或网络推断 |
隐私与缓存
- GPS 默认关闭;
includeLocation 只有显式为 true 时才读取位置。
- 不进行逆地理编码,不把坐标转换成地址。
- Android / iOS 均使用系统公开 API 在本地解析;插件不发起网络请求;iCloud-only 资源在本地不可用时可能单项失败。
- 不上传、不记录、不持久化位置;调用方也不应把位置写入日志。
- 非敏感 metadata 缓存只包含
schemaVersion / id / mediaType / modifiedTime / width / height / durationMs / orientation / captureTime / cameraMake / cameraModel / lensModel / iso / exposureTime / aperture / focalLength / focalLength35mm / videoCodec / videoBitrate / videoFrameRate。
- 位置每次新鲜读取且不进入缓存;即使
useCache: true 也不会复用位置。
平台与自定义基座
| 平台 |
是否支持 |
说明 |
| uni-app Android / iOS |
支持 |
Android 使用 MediaStore、ExifInterface、MediaExtractor;iOS 使用 PhotoKit、ImageIO、AVFoundation |
| uni-app x Android / iOS |
支持 |
从插件根目录导入,提供完整 UTS 类型 |
| HarmonyOS / Web / 微信小程序 / 支付宝小程序 |
暂不支持 |
返回 9070031,不会伪造成功 |
本能力新增 Android 依赖以及 Android / iOS 原生逻辑。发布或使用前,两端都必须重新制作并重新安装与插件代码匹配的自定义基座;只更新普通页面资源不能替代原生联编。
图片列表
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
// 读取最新 30 张图片。includeThumbnail=true 会尽量返回缩略图路径。
GalleryPro.getGalleryImages({
pageSize: 30,
includeThumbnail: true,
success(res) {
console.log('图片总数', res.total)
console.log('本页图片', res.items)
console.log('下一页令牌', res.nextPageToken)
}
})
视频列表
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
// 只读取最近 7 天的视频,适合短视频投稿和素材管理。
GalleryPro.getGalleryVideos({
pageSize: 20,
startTime: Date.now() - 7 * 24 * 60 * 60 * 1000,
includeThumbnail: true,
success(res) {
console.log('视频列表', res.items)
}
})
图片视频混合列表示例
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
let nextPageToken = ''
function loadMixedPage() {
// mediaType='all' 表示图片视频混合列表;pageToken 为空时读取第一页。
GalleryPro.getGalleryMedia({
mediaType: 'all',
pageSize: 40,
pageToken: nextPageToken,
sourceType: 'all',
sortOrder: 'desc',
success(res) {
console.log('当前页媒体', res.items)
nextPageToken = res.nextPageToken
// 需要全量读取时,不要一次性设置超大 pageSize;建议这样循环读取下一页。
if (res.hasMore) {
loadMixedPage()
}
}
})
}
缩略图与导出示例
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
// 列表页建议先拿缩略图,减少原图/原视频加载压力。
GalleryPro.getGalleryThumbnails({
ids: ['media-id-1', 'media-id-2'],
width: 240,
height: 240,
success(res) {
console.log('缩略图结果', res.items)
}
})
// 用户点击预览、编辑或上传前,再导出临时文件。
GalleryPro.exportMediaToTempFile({
id: 'media-id-1',
exportType: 'render',
success(res) {
console.log('renderPath 用于页面显示,uploadPath 用于上传')
console.log(res.renderPath, res.uploadPath)
}
})
批量保存到系统相册
saveMediaToGallery 接收已经存在且可读取的本地图片、视频路径,按 paths 顺序逐项保存。它不负责下载网络 URL;如媒体来自系统相册,请先通过 exportMediaToTempFile 取得 uploadPath,再传给保存 API。
uni-app 示例
import { saveMediaToGallery } from '@/uni_modules/lizhao-gallery-pro'
// 图片和视频可以混合传入,结果 items 与 paths 保持相同顺序。
saveMediaToGallery({
paths: [
'/absolute/path/generated-poster.jpg',
'/absolute/path/rendered-video.mp4'
],
albumName: '业务素材',
duplicatePolicy: 'allow',
progress(event) {
console.log('保存进度', event.current, event.total, event.progress)
},
success(res) {
console.log('保存成功数、跳过数、失败数', res.successCount, res.skippedCount, res.failCount)
console.log('逐项结果', res.items)
},
fail(err) {
console.log('参数或权限检查失败', err.errCode, err.errMsg)
}
})
uni-app x 示例
import {
saveMediaToGallery,
type GallerySaveOptions,
type GallerySaveProgress,
type GallerySaveResult,
type GalleryFail
} from '@/uni_modules/lizhao-gallery-pro'
const paths = ['/absolute/path/generated-poster.jpg'] as Array<string>
// skip 只跳过平台公开 API 能可靠识别的可见重复项,不读取私有元数据。
saveMediaToGallery({
paths,
albumName: '',
duplicatePolicy: 'skip',
progress: (event : GallerySaveProgress) => console.log('保存进度', event.progress),
success: (res : GallerySaveResult) => console.log('保存结果', res.items),
fail: (err : GalleryFail) => console.log('保存失败', err.errCode, err.errMsg)
} as GallerySaveOptions)
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GallerySaveOptions |
是 |
保存参数对象 |
无 |
paths / albumName / duplicatePolicy / progress / success / fail / complete |
| options.paths |
Array<string> |
是 |
可读取的本地图片、视频绝对路径或 file:// 路径 |
无 |
无 |
| options.albumName |
string |
否 |
目标相册名;空字符串写入系统默认相册 |
'' |
无 |
| options.duplicatePolicy |
'allow' \| 'skip' |
否 |
允许重复保存,或按公开元数据跳过可见重复项 |
'allow' |
'allow' / 'skip' |
| options.progress |
function |
否 |
每完成一个输入项后触发,包含当前序号、总数、进度和本项结果 |
无 |
无 |
| options.success |
function |
否 |
批次执行完成后触发;允许部分成功,详情查看 items |
无 |
无 |
| options.fail |
function |
否 |
参数为空、权限被拒绝等批次无法启动时触发 |
无 |
无 |
| options.complete |
function |
否 |
成功或失败后均触发一次 |
无 |
无 |
返回值
| 字段 |
类型 |
说明 |
| success |
boolean |
是否所有输入项均成功保存或按策略跳过 |
| successCount |
number |
保存成功或按策略跳过的数量 |
| skippedCount |
number |
因 duplicatePolicy='skip' 被跳过的数量 |
| failCount |
number |
保存失败的数量 |
| items |
Array<GallerySaveItemResult> |
与传入 paths 顺序一致的逐项结果 |
权限与平台边界
- Android 10 及以上通过
MediaStore 写入;Android 9 及以下需要 WRITE_EXTERNAL_STORAGE,插件清单仅声明到 API 28。
- iOS 默认相册且
duplicatePolicy: 'allow' 时只请求添加权限;自定义相册或 skip 判重需要 PhotoKit 读写权限。
skip 不是内容哈希去重。只有文件名、媒体类型和文件大小等公开信息可靠可见时才会跳过;无法可靠判断时继续保存,避免误判。
- Web、Harmony 和小程序当前明确返回
9070024,不会伪造保存成功。
- 本功能包含 App 原生 UTS / Swift 和权限清单,升级插件后必须重新制作对应平台自定义基座。
上传示例
Android / iOS 均支持 concurrency、retryCount 和 dryRun。实际上传前插件会先把相册资产导出为可上传临时路径,dryRun=true 只做导出校验并保留结果顺序,不会发起网络请求。
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
// 有服务端时,传入 url 后插件会先导出文件,再调用上传接口。
GalleryPro.uploadGalleryMedia({
ids: ['media-id-1', 'media-id-2'],
url: 'https://example.com/upload',
dryRun: false,
name: 'file',
concurrency: 2,
retryCount: 1,
progress(event) {
console.log('上传进度', event.stage, event.current, event.total, event.progress)
},
success(res) {
console.log('上传成功数', res.successCount)
console.log('上传失败数', res.failCount)
console.log('items 顺序与 options.ids 一致,index 是传入 ids 的原始序号', res.items)
}
})
没有上传服务器时,可以先用 dryRun=true 校验导出链路。它只导出并返回路径,不会发起网络请求。
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
GalleryPro.uploadGalleryMedia({
ids: ['media-id-1'],
dryRun: true,
progress(event) {
console.log('导出校验进度', event.stage, event.progress)
},
success(res) {
console.log('可上传路径', res.items[0].uploadPath)
}
})
完整示例路径
| 项目类型 |
示例路径 |
说明 |
| uni-app |
uni_modules/lizhao-gallery-pro/example/uniapp/galleryPro.vue |
权限、图片列表、视频列表、混合分页、缩略图、导出、上传和缓存清理 |
| uni-app x |
uni_modules/lizhao-gallery-pro/example/uniappx/index.uvue |
使用同一组 API 验证 App 端能力 |
相册变化实时监听
插件提供轻量原生变化通知,只告诉业务“相册可能发生变化”,不会擅自修改页面列表;收到事件后继续调用已有的 getGalleryMedia、getGalleryImages 或 getGalleryVideos 获取最新数据。
uni-app 示例
import {
startGalleryChangeObserver,
stopGalleryChangeObserver,
getGalleryMedia
} from '@/uni_modules/lizhao-gallery-pro'
let observerId = ''
// 页面进入后启动;change 是持续回调。
startGalleryChangeObserver({
mediaType: 'all',
debounceMs: 300,
change(event) {
if (event.reason == 'permissionChanged') return
// 原生通知不携带精确增删 ID,业务重新查询当前列表。
getGalleryMedia({
mediaType: 'all',
pageSize: 30,
success(res) {
console.log('最新媒体列表', res.items)
}
})
},
success(res) {
observerId = res.observerId
},
fail(err) {
console.log('监听启动失败', err)
}
})
// 页面卸载前必须停止,避免页面回调被长期持有。
function releaseGalleryObserver() {
if (observerId.length == 0) return
stopGalleryChangeObserver({
observerId,
success() {
observerId = ''
}
})
}
uni-app x 示例
import {
startGalleryChangeObserver,
stopGalleryChangeObserver,
getGalleryImages,
type GalleryChangeEvent,
type GalleryChangeObserverStartResult
} from '@/uni_modules/lizhao-gallery-pro'
const observerId = ref<string>('')
function reloadImages() : void {
getGalleryImages({
pageSize: 30,
success: (res) => {
console.log('最新图片数量:' + res.items.length.toString())
}
})
}
function startObserver() : void {
startGalleryChangeObserver({
mediaType: 'image',
debounceMs: 300,
change: (event : GalleryChangeEvent) => {
if (event.reason != 'permissionChanged') reloadImages()
},
success: (res : GalleryChangeObserverStartResult) => {
observerId.value = res.observerId
}
})
}
function stopObserver() : void {
if (observerId.value.length == 0) return
stopGalleryChangeObserver({
observerId: observerId.value,
success: (_) => {
observerId.value = ''
}
})
}
startGalleryChangeObserver(options)
启动系统相册变化监听。启动前应先完成相册读取授权。
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryChangeObserverOptions |
是 |
启动参数 |
无 |
mediaType / debounceMs / includeChanges / maxChanges / change / success / fail / complete |
| options.mediaType |
GalleryMediaType |
否 |
业务准备刷新的媒体范围,不表示原生变化的精确类型 |
all |
image / video / all |
| options.debounceMs |
number |
否 |
内容变化防抖时间,超出范围会收敛到 0~5000ms |
300 |
0~5000 |
| options.includeChanges |
boolean |
否 |
是否计算并返回精确新增、删除、修改 ID |
false |
true / false |
| options.maxChanges |
number |
否 |
精确监听单次最大变化数;超过后要求重建基线 |
2000 |
1~10000 |
| options.change |
function |
是 |
相册变化持续回调 |
无 |
无 |
| options.success |
function |
否 |
原生监听注册成功回调 |
无 |
无 |
| options.fail |
function |
否 |
注册失败回调 |
无 |
无 |
| options.complete |
function |
否 |
注册动作完成回调,不表示监听生命周期结束 |
无 |
无 |
启动成功结果:
| 字段 |
类型 |
说明 |
| observerId |
string |
当前监听器唯一 ID |
| platform |
string |
当前平台 |
| message |
string |
中文说明 |
变化事件:
| 字段 |
类型 |
说明 |
| observerId |
string |
触发事件的监听器 ID |
| mediaType |
GalleryMediaType |
业务配置的刷新范围 |
| reason |
GalleryChangeReason |
contentChanged / appResume / permissionChanged |
| changedAt |
number |
事件发生时间,毫秒时间戳 |
| mergedCount |
number |
防抖窗口内合并的原生通知数量 |
| permissionStatus |
GalleryPermissionStatus |
权限变化后的状态,仅权限事件返回 |
| detailsAvailable |
boolean |
是否已返回精确变化详情 |
| addedIds |
Array<string> |
新增媒体 ID,仅精确监听返回 |
| removedIds |
Array<string> |
删除媒体 ID,仅精确监听返回 |
| updatedIds |
Array<string> |
公开元数据变化的媒体 ID,仅精确监听返回 |
| changeCount |
number |
三类精确变化数量之和 |
| cursor / nextCursor |
string |
本次使用的旧游标和事件完成后的新游标 |
| resetRequired |
boolean |
是否需要业务重新执行全量查询 |
| resetReason |
GalleryChangeCursorResetReason |
重建原因 |
| message |
string |
中文说明 |
stopGalleryChangeObserver(options)
停止指定监听器。页面卸载前应显式调用。
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryChangeObserverStopOptions |
是 |
停止参数 |
无 |
observerId / success / fail / complete |
| options.observerId |
string |
是 |
启动时返回的监听器 ID |
无 |
无 |
| options.success |
function |
否 |
停止成功回调 |
无 |
无 |
| options.fail |
function |
否 |
ID 无效或停止失败回调 |
无 |
无 |
| options.complete |
function |
否 |
停止动作完成回调 |
无 |
无 |
| 字段 |
类型 |
说明 |
| observerId |
string |
已停止的监听器 ID |
| stopped |
boolean |
是否已经停止 |
| message |
string |
中文说明 |
监听兼容边界
| 平台 |
是否支持 |
说明 |
| uni-app Android / iOS |
支持 |
从插件根目录导入,页面卸载前停止 |
| uni-app x Android / iOS |
支持 |
提供完整 UTS 强类型 |
| HarmonyOS / Web / 小程序 |
暂不支持 |
返回明确不支持错误,不伪造成功 |
| 精确新增、删除、修改 ID |
支持 |
设置 includeChanges: true;可靠业务重试优先使用 getGalleryChanges |
| 应用退出后的后台常驻监听 |
暂不支持 |
仅应用进程存活期间有效 |
持久化增量游标
适合相册备份、素材库同步、云盘增量上传和列表局部刷新。首次不传 cursor 建立基线,业务处理完变化后再持久化 nextCursor;旧游标在有效期内保持不可变,处理失败时可安全重试。
import {
getGalleryChanges,
clearGalleryChangeCursor
} from '@/uni_modules/lizhao-gallery-pro'
// 首次建立基线;把 nextCursor 保存到业务持久化存储。
getGalleryChanges({
mediaType: 'all',
success(res) {
uni.setStorageSync('galleryCursor', res.nextCursor)
},
fail(err) {
console.error('相册增量基线建立失败', err)
}
})
// 下次启动后继续读取精确变化;处理成功后才推进游标。
getGalleryChanges({
cursor: uni.getStorageSync('galleryCursor'),
mediaType: 'all',
maxChanges: 2000,
success(res) {
if (res.resetRequired) {
// 权限、过滤条件、过期或变化过多时,先重新加载完整列表。
console.log('需要重建全量列表', res.resetReason)
} else {
console.log('新增', res.addedIds)
console.log('删除', res.removedIds)
console.log('修改', res.updatedIds)
}
uni.setStorageSync('galleryCursor', res.nextCursor)
}
})
getGalleryChanges(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryChangesOptions |
是 |
增量查询参数 |
无 |
cursor / mediaType / maxChanges / success / fail / complete |
| options.cursor |
string |
否 |
上一次保存的不透明游标;为空时建立初始基线 |
空字符串 |
插件返回的 nextCursor |
| options.mediaType |
GalleryMediaType |
否 |
媒体范围,并与游标创建条件绑定 |
all |
image / video / all |
| options.maxChanges |
number |
否 |
单次允许返回的最大变化数;超过后不截断数组,要求重建基线 |
2000 |
1~10000 |
| options.success |
function |
否 |
快照生成成功时触发,包括需要重建基线的结果 |
无 |
无 |
| options.fail |
function |
否 |
参数、权限、扫描或快照读写失败时触发 |
无 |
无 |
| options.complete |
function |
否 |
查询完成后触发 |
无 |
无 |
| 字段 |
类型 |
说明 |
| isInitial |
boolean |
是否为首次建立基线 |
| resetRequired |
boolean |
是否需要重新执行全量查询 |
| resetReason |
GalleryChangeCursorResetReason |
none / cursorNotFound / cursorExpired / permissionChanged / filterChanged / tooManyChanges / snapshotChangedDuringScan |
| addedIds / removedIds / updatedIds |
Array<string> |
稳定排序的新增、删除、修改媒体 ID |
| changeCount |
number |
三类变化数量之和 |
| currentTotal |
number |
当前范围可见媒体总数 |
| nextCursor |
string |
当前完整快照对应的新游标 |
| createdAt |
number |
新游标创建时间,毫秒时间戳 |
| message |
string |
中文说明 |
clearGalleryChangeCursor(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryClearChangeCursorOptions |
是 |
游标清理参数 |
无 |
cursor / success / fail / complete |
| options.cursor |
string |
是 |
插件生成的不透明游标 |
无 |
无 |
| options.success |
function |
否 |
清理成功时触发;游标不存在仍成功且 removed=false |
无 |
无 |
| options.fail |
function |
否 |
游标格式或文件删除失败时触发 |
无 |
无 |
| options.complete |
function |
否 |
清理完成后触发 |
无 |
无 |
API 说明
| API |
作用 |
常用场景 |
checkGalleryPermission(options) |
检查相册读取权限 |
页面入口、权限引导 |
requestGalleryPermission(options) |
请求相册读取权限 |
首次使用、用户重新授权 |
getGalleryMedia(options) |
读取图片、视频或混合媒体 |
自定义素材列表 |
getGalleryImages(options) |
读取图片列表 |
图片选择、图片上传 |
getGalleryVideos(options) |
读取视频列表 |
视频选择、视频上传 |
getGalleryThumbnails(options) |
批量生成缩略图 |
列表封面、九宫格 |
getMediaById(options) |
按 ID 读取单个媒体 |
详情页、导出前确认 |
exportMediaToTempFile(options) |
导出为临时文件 |
页面预览、编辑、上传 |
uploadGalleryMedia(options) |
导出并上传相册媒体 |
批量提交、dry-run 校验 |
getGalleryAlbums(options) |
获取相册分组 |
相册入口、来源分类 |
getGalleryMetadata(options) |
批量读取图片 EXIF 与视频参数 |
媒体详情、素材整理 |
clearGalleryCache(options) |
清理插件缓存 |
控制缓存体积 |
getGalleryChanges(options) |
查询持久化游标以来的精确变化 |
增量备份、局部刷新 |
clearGalleryChangeCursor(options) |
幂等清理指定增量游标 |
退出账号、重置同步 |
startGalleryChangeObserver(options) |
监听系统相册变化,可选精确详情 |
页面实时刷新 |
stopGalleryChangeObserver(options) |
停止指定相册变化监听 |
页面卸载 |
getGalleryCapabilities() |
获取能力矩阵 |
平台判断、入口控制 |
API 参数表
checkGalleryPermission(options) / requestGalleryPermission(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryPermissionOptions |
是 |
权限参数对象 |
无 |
mediaType / preferFullAccess / success / fail / complete |
| options.mediaType |
GalleryMediaType |
否 |
需要检查或请求的媒体类型 |
all |
image / video / all |
| options.preferFullAccess |
boolean |
否 |
iOS 有限照片权限场景下是否更倾向完整权限 |
false |
true / false |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
getGalleryMedia(options) / getGalleryImages(options) / getGalleryVideos(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryQueryOptions |
是 |
查询参数对象 |
无 |
mediaType / pageSize / pageToken / startTime / endTime / albumId / sourceType / sortOrder / includeThumbnail / success / fail / complete |
| options.mediaType |
GalleryMediaType |
否 |
媒体类型,专用方法会自动覆盖 |
all |
image / video / all |
| options.pageSize |
number |
否 |
每页数量 |
30 |
建议 1-100 |
| options.pageToken |
string |
否 |
下一页令牌 |
空字符串 |
上次返回的 nextPageToken |
| options.startTime |
number |
否 |
开始时间,毫秒时间戳 |
无 |
无 |
| options.endTime |
number |
否 |
结束时间,毫秒时间戳 |
无 |
无 |
| options.albumId |
string |
否 |
相册 ID |
无 |
getGalleryAlbums 返回的 albumId |
| options.sourceType |
GallerySourceType |
否 |
来源分类过滤 |
all |
camera / screenshot / wechat / qq / download / other / all |
| options.sortOrder |
GallerySortOrder |
否 |
排序方式 |
desc |
desc / asc |
| options.includeHidden |
boolean |
否 |
是否包含隐藏媒体 |
false |
true / false |
| options.includeThumbnail |
boolean |
否 |
是否尽量返回缩略图 |
false |
true / false |
| options.thumbnailWidth |
number |
否 |
缩略图宽度 |
240 |
无 |
| options.thumbnailHeight |
number |
否 |
缩略图高度 |
240 |
无 |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
getGalleryThumbnails(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryThumbnailOptions |
是 |
缩略图参数对象 |
无 |
ids / width / height / quality / success / fail / complete |
| options.ids |
Array<string> |
是 |
媒体 ID 列表 |
无 |
无 |
| options.width |
number |
否 |
缩略图宽度 |
240 |
无 |
| options.height |
number |
否 |
缩略图高度 |
240 |
无 |
| options.quality |
number |
否 |
图片质量 |
80 |
1-100 |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
getMediaById(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryMediaByIdOptions |
是 |
单媒体查询参数 |
无 |
id / includeThumbnail / success / fail / complete |
| options.id |
string |
是 |
媒体 ID |
无 |
无 |
| options.includeThumbnail |
boolean |
否 |
是否返回缩略图 |
false |
true / false |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
exportMediaToTempFile(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryExportOptions |
是 |
导出参数对象 |
无 |
id / exportType / fileName / success / fail / complete |
| options.id |
string |
是 |
媒体 ID |
无 |
无 |
| options.exportType |
GalleryExportType |
否 |
导出用途 |
render |
render / upload / original |
| options.fileName |
string |
否 |
自定义文件名 |
自动生成 |
无 |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
uploadGalleryMedia(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryUploadOptions |
是 |
上传参数对象 |
无 |
ids / url / dryRun / name / formData / concurrency / retryCount / timeoutMs / progress / success / fail / complete |
| options.ids |
Array<string> |
是 |
媒体 ID 列表 |
无 |
无 |
| options.url |
string |
否 |
上传地址,dryRun=true 时可不传 |
无 |
无 |
| options.dryRun |
boolean |
否 |
是否只导出校验,不发起网络请求 |
false |
true / false |
| options.name |
string |
否 |
文件字段名 |
file |
无 |
| options.formData |
UTSJSONObject |
否 |
附加表单字段 |
无 |
无 |
| options.concurrency |
number |
否 |
并发数量 |
1 |
建议 1-3 |
| options.retryCount |
number |
否 |
失败重试次数 |
0 |
无 |
| options.timeoutMs |
number |
否 |
单文件上传超时 |
60000 |
无 |
| options.progress |
function |
否 |
进度回调 |
无 |
无 |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
getGalleryAlbums(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryAlbumsOptions |
否 |
分组查询参数对象 |
{} |
mediaType / sourceType / success / fail / complete |
| options.mediaType |
GalleryMediaType |
否 |
统计图片、视频或全部媒体 |
all |
image / video / all |
| options.sourceType |
GallerySourceType |
否 |
来源分类过滤,例如 sourceType='screenshot' |
all |
camera / screenshot / wechat / qq / download / other / all |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
clearGalleryCache(options)
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GalleryClearCacheOptions |
否 |
缓存清理参数 |
{ cacheType: 'all' } |
cacheType / olderThanMs / success / fail / complete |
| options.cacheType |
GalleryCacheType |
否 |
清理范围;metadata 仅清理非敏感元数据,all 包含元数据缓存 |
all |
all / thumbnail / export / changeCursor / metadata |
| options.olderThanMs |
number |
否 |
只清理早于该时间的缓存 |
无 |
毫秒时间戳 |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro'
// 只清理缩略图缓存,不影响已经导出的上传临时文件。
GalleryPro.clearGalleryCache({ cacheType: 'thumbnail' })
返回值表
GalleryPermissionResult
| 字段 |
类型 |
说明 |
| granted |
boolean |
是否已获得可读取权限 |
| status |
GalleryPermissionStatus |
权限状态:authorized / limited / denied / restricted / notDetermined / unsupported |
| mediaType |
GalleryMediaType |
本次检查或请求的媒体类型 |
| limited |
boolean |
iOS 是否为有限照片权限 |
| shouldOpenSettings |
boolean |
是否建议引导用户打开系统设置 |
| platform |
string |
当前平台 |
| message |
string |
中文说明 |
GalleryQueryResult
| 字段 |
类型 |
说明 |
| success |
boolean |
是否成功 |
| platform |
string |
当前平台 |
| mediaType |
GalleryMediaType |
当前查询媒体类型 |
| total |
number |
当前条件下可见媒体总数 |
| items |
Array<GalleryMediaItem> |
当前页媒体列表 |
| hasMore |
boolean |
是否还有下一页 |
| nextPageToken |
string |
下一页令牌 |
| message |
string |
中文说明 |
GalleryMediaItem
| 字段 |
类型 |
说明 |
| id |
string |
稳定媒体 ID |
| mediaType |
GalleryMediaType |
image / video |
| fileName |
string |
文件名 |
| mimeType |
string |
MIME 类型 |
| width / height |
number |
宽高 |
| durationMs |
number |
视频时长,图片为 0 |
| size |
number |
文件大小,单位字节 |
| createTime / modifiedTime |
number |
创建和修改时间,毫秒时间戳 |
| albumId / albumName |
string |
相册 ID 和相册名称 |
| sourceType / sourceLabel |
string |
来源分类和中文说明 |
| originalPath |
string |
原始路径或平台资产标识 |
| renderPath |
string |
页面可显示路径,必要时先调用导出 API |
| uploadPath |
string |
上传可用路径 |
| thumbnailPath |
string |
缩略图路径 |
| requiresExport |
boolean |
是否需要导出后才能稳定显示 |
GalleryExportResult
| 字段 |
类型 |
说明 |
| success |
boolean |
是否成功 |
| id |
string |
媒体 ID |
| renderPath |
string |
页面可渲染路径 |
| uploadPath |
string |
上传可用路径 |
| size |
number |
导出文件大小 |
| message |
string |
中文说明 |
GalleryUploadResult
| 字段 |
类型 |
说明 |
| success |
boolean |
整体是否成功 |
| successCount |
number |
成功数量 |
| failCount |
number |
失败数量 |
| items |
Array<GalleryUploadItemResult> |
上传明细,顺序与 options.ids 一致 |
| message |
string |
中文说明 |
GalleryAlbumItem
| 字段 |
类型 |
说明 |
| albumId |
string |
相册 ID |
| albumName |
string |
相册名称 |
| sourceType |
GallerySourceType |
来源分类 |
| count |
number |
媒体总数 |
| imageCount |
number |
图片数量 |
| videoCount |
number |
视频数量 |
| coverThumbnailPath |
string |
相册封面缩略图路径 |
| latestMediaId |
string |
最新媒体 ID |
| latestMediaType |
GalleryMediaType |
最新媒体类型 |
| latestFileName |
string |
最新媒体文件名 |
| latestCreateTime |
number |
最新媒体创建时间 |
错误码
| 错误码 |
含义 |
说明 |
| 9070001 |
unsupported or context unavailable |
当前平台不支持,或 App 上下文不可用 |
| 9070002 |
permission denied |
相册读取权限未授权或请求失败 |
| 9070003 |
invalid options |
参数为空、ID 列表为空或格式不正确 |
| 9070004 |
media not found |
指定媒体不存在,可能已被删除或 ID 不属于当前平台 |
| 9070005 |
album query failed |
相册分组查询失败 |
| 9070006 |
cache failed |
缓存目录创建或写入失败 |
| 9070007 |
query failed |
相册列表、分组或平台桥接查询失败 |
| 9070008 |
thumbnail failed |
缩略图生成失败 |
| 9070009 |
export failed |
媒体导出失败,iOS 可能需要先下载 iCloud 原图 |
| 9070010 |
upload failed |
上传过程失败,包含上传地址为空、网络请求失败或超时 |
| 9070011 |
cache clear failed |
缓存清理失败 |
| 9070012 |
cancelled |
任务被取消或系统中断 |
| 9070013 |
file unavailable |
导出后的文件不可访问 |
| 9070014 |
internal failed |
插件内部异常,建议保留日志排查 |
| 9070015 |
observer register failed |
Android/iOS 原生相册变化观察器注册失败 |
| 9070016 |
observer not found |
observerId 不存在或已经停止 |
| 9070017 |
invalid observer options |
缺少 change 回调或监听参数不合法 |
| 9070018 |
invalid save options |
paths 为空、全部为空字符串或参数不合法 |
| 9070019 |
source unavailable |
本地源文件不存在、不可读或不是普通文件 |
| 9070020 |
unsupported media type |
输入文件无法识别为支持的图片或视频 |
| 9070021 |
add permission denied |
系统相册写入或判重所需读取权限被拒绝 |
| 9070022 |
album operation failed |
创建、查找或更新指定目标相册失败 |
| 9070023 |
save media failed |
创建相册记录、复制文件或 PhotoKit 保存失败 |
| 9070024 |
save unsupported |
当前平台没有系统相册保存实现 |
| 9070025 |
invalid change cursor options |
增量参数或游标格式不合法 |
| 9070026 |
change snapshot failed |
增量快照扫描、读取或写入失败 |
| 9070027 |
gallery changes unsupported |
当前平台不支持系统相册增量变化 |
| 9070028 |
clear change cursor failed |
指定增量游标清理失败 |
| 9070029 |
invalid gallery metadata options |
元数据参数无效,例如 ID 为空、超过 100 个或存在重复 ID |
| 9070030 |
gallery metadata read failed |
单个媒体的元数据读取失败 |
| 9070031 |
gallery metadata unsupported |
当前平台不支持系统相册元数据读取 |
| 9070032 |
gallery metadata cache failed |
非敏感元数据缓存读写失败;属于非致命错误,插件继续尝试读取原始媒体 |
权限与自定义基座
| 平台 |
是否支持 |
说明 |
| uni-app App Android |
支持 |
Android 13+ 使用图片/视频媒体权限;Android 12 及以下使用外部存储读取权限 |
| uni-app App iOS |
支持 |
使用 PhotoKit,支持完整权限和有限照片权限 |
| uni-app x App Android |
支持 |
API 与 uni-app 一致,示例使用 UVUE |
| uni-app x App iOS |
支持 |
API 与 uni-app 一致,导出后返回可渲染路径 |
| App HarmonyOS |
暂不支持 |
不支持平台会明确失败,不伪造成功 |
| Web / H5 |
暂不支持 |
不支持平台会明确失败,不伪造成功 |
| 微信小程序 / 支付宝小程序 |
暂不支持 |
不支持平台会明确失败,不伪造成功 |
App 端首次集成或修改 utssdk/app-android、utssdk/app-ios、权限配置、原生依赖后,需要重新制作并安装自定义基座。只修改页面示例、样式、README、普通脚本时,通常不需要重新打自定义基座。
Android 权限建议:
- Android 13 及以上:系统会按图片、视频分别授予读取权限。
- Android 12 及以下:使用外部存储读取权限。
- 如果用户拒绝并勾选不再询问,业务应根据
shouldOpenSettings 引导用户到系统设置。
iOS 权限建议:
authorized 表示可读取完整相册。
limited 表示用户只授权了部分照片,插件会按系统可见范围读取。
- 需要在原生配置中声明相册读取和保存相关用途说明。
注意事项
- 页面只从插件根目录导入:
import * as GalleryPro from '@/uni_modules/lizhao-gallery-pro',不要导入 utssdk 子路径。
- 异步 API 都支持
success / fail / complete,业务可以统一做成功、失败和收尾处理。
- 建议先调用
checkGalleryPermission,未授权再调用 requestGalleryPermission。
- 大图库请分页读取,不建议用超大
pageSize 做一次性全量读取;如确需全量读取,请使用 nextPageToken 循环读取下一页。
- 列表页优先显示
thumbnailPath;需要原图预览或上传时,再调用 exportMediaToTempFile。
renderPath 用于页面显示,uploadPath 用于上传;不同平台路径格式不同,业务不要自行拼接路径。
uploadGalleryMedia 的结果明细顺序与 options.ids 一致,index 是传入 ids 的原始序号。
- 来源分类依赖系统相册目录、文件名和平台元数据,能覆盖相机、截图、微信、QQ、下载等常见来源,但不同 ROM 或应用保存目录可能存在差异。
clearGalleryCache({ cacheType: 'thumbnail' }) 只清理缩略图缓存,cacheType: 'export' 只清理导出缓存。
- 不支持平台会明确失败,业务可通过
getGalleryCapabilities() 控制入口显示。
作者系列UTS插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 |
能力方向 |
插件市场 |
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 |
查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 |
查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 |
查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 |
查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 |
查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 |
查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 |
查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 |
查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 |
查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 |
查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 |
查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 |
查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 |
查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 |
查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 |
查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 |
查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 |
查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 |
查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 |
查看插件 |