更新记录

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 均支持 concurrencyretryCountdryRun。实际上传前插件会先把相册资产导出为可上传临时路径,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 端能力

相册变化实时监听

插件提供轻量原生变化通知,只告诉业务“相册可能发生变化”,不会擅自修改页面列表;收到事件后继续调用已有的 getGalleryMediagetGalleryImagesgetGalleryVideos 获取最新数据。

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-androidutssdk/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 流式请求 查看插件

隐私、权限声明

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

Android 需要读取图片/视频媒体权限;Android 9 及以下保存媒体需要 WRITE_EXTERNAL_STORAGE;iOS 需要 NSPhotoLibraryUsageDescription 与 NSPhotoLibraryAddUsageDescription。

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

插件仅在用户授权后读取本机相册媒体索引和生成本地临时文件,不上传相册内容;如使用 uploadGalleryMedia,上传地址由业务方显式传入。

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