更新记录

1.0.0(2026-05-08)

自定义媒体选择器 (UTS)(图片、视频)

基于 UTS 实现的Android端图片/视频选择器,提供相册列表、网格视图、多选、预览、原图 / 压缩切换等功能。支持自定义主题色、布局、文字、控件尺寸等细节。


平台支持

现阶段仅支持安卓


注意事项

  • 使用前请确保已申请存储读取权限(例如 WRITE_EXTERNAL_STORAGE 或 Android 13 后的媒体权限),插件本身不负责权限申请。
  • 大图列表或视频预览时注意内存压力,插件已做 LRU 缓存和 Bitmap 回收,但仍建议在页面销毁时调用closeMediaChoose()或等待用户手动关闭。
  • 兼容不同屏幕比例,但是在平板等宽屏设备上,建议通过config参数调大gridColumnCount,以获得更佳的浏览体验。
  • 插件​本身没有内置自动跟随系统的暗黑模式切换功能​,但完全可以通过config 参数实现日间/暗黑模式的切换。
    • 所有视觉元素(背景色、文字色、蒙层、按钮等)在代码中都通过 config 来控制,没有任何颜色值是硬编码写死的。所以在调用 chooseMedia 前准备好两套配置,就能实现主题切换。
    • 切换主题配置后,需要重新调用 chooseMedia 才能生效。已经打开的选择器不会热更新。如果你需要在用户未关闭选择器的情况下实时切换,目前做不到
  • ios暂未实现,敬请期待

快速开始

引入模块

import { chooseMedia, closeMediaChoose, MediaFilesResult, MediaConfig, ChooseMediaOptions } from "@/uni_modules/l-media";

最简调用(Promise / async-await)

const res = await chooseMedia({ count: 9 });
if (res) {
  console.log('已选择文件:', res);
} else {
  console.log('用户取消选择');
}

回调式调用

chooseMedia({
  count: 9,
  success: (res) => { console.log(res); },
  fail: (err) => { console.error(err); },
  complete: (res) => { console.log('完成'); }
});

自定义配置

// 默认配置
const mediaConfig : MediaConfig = {
  // 主题色
  primary: "#F94258",

  // 主界面背景
  bgColor: "#181818",
  navBarBgColor: "#222222",
  bottomBarBgColor: "#222222",

  // 文字颜色
  textColor: "#FFFFFF",
  textColorSecondary: "#999999",
  textColorDisabled: "#555555",

  // 蒙层 / 占位
  selectedMaskColor: "#80000000",
  imagePlaceholderColor: "#000000",
  videoTagBgColor: "#40000000",

  // 复选框颜色
  checkboxBgColor: "#33000000",
  checkboxStrokeColor: "#FFFFFF",

  // 按钮
  buttonInactiveColor: "#666666",

  // 相册菜单
  albumMenuDividerColor: "#333333",
  albumMenuBgColor: "#000000",

  // 预览界面
  previewNavBarBgColor: "#c0000000",
  previewBottomBarBgColor: "#c0000000",
  previewBgColor: "#000000",

  // 复选框尺寸 / 触摸区域
  checkboxSize: 50,
  checkboxTouchAreaSize: 40,
  checkboxTouchPaddingV: 20,
  checkboxTouchPaddingH: 20,

  // 网格布局
  gridColumnCount: 4,

  // 字号
  textSizeTitle: 17.0,
  textSizeBody: 15.0,
  textSizeTiny: 10.0,

  // 分页加载
  pageSize: 60,
  preloadThreshold: 50,

  // 图片压缩
  compressionQuality: 70
}

const customConfig: MediaConfig = {
  primary: '#007AFF',
  bgColor: '#F2F2F7',
  gridColumnCount: 3,
  pageSize: 40,
};
const files = await chooseMedia({ count: 5 }, customConfig);

强制关闭选择器

当需要从外部关闭弹出的选择器(例如页面返回时)

closeMediaChoose();

API 说明

chooseMedia(options, config?)

打开媒体选择器。

参数

  • options: ChooseMediaOptions:— 选择行为配置(必填)
  • config?: MediaConfig:— UI 及功能配置(可选,不传则使用默认深色主题)

返回值

  • Android:— Promise<MediaFilesResult | null>

closeMediaChoose()

主动关闭选择器(带动画)。可用于外部监听到页面返回时关闭 UI。


选项说明

ChooseMediaOptions

字段 类型 默认值 说明
count number 9 最多可选文件数量
mediaType ("image" | "video")[] ["image", "video"] 可选媒体类型
sizeType ("original" | "compressed")[] 两者均包含 图片是否允许原图/压缩。original仅原图;compressed仅压缩;或不传则显示原图切换开关
extension string[] 文件扩展名白名单(不带点),如["jpg","png","mp4"]
maxSize number 单个文件大小上限(字节)。纯原图模式下在 SQL 层过滤,压缩模式在发送时压缩后校验
success (res: MediaFilesResult) => void -- 选择成功回调
fail (err: MediaFilesFail) => void -- 选择失败回调
complete (res: any) => void -- 完成回调(不论成功/失败/取消)

MediaFile(返回的文件对象)

字段 类型 说明
fileType string "image""video"
path string 文件绝对路径(file://协议)
size number 文件大小(字节)
width number 图片/视频宽度
height number 图片/视频高度
name string 文件名
thumbTempFilePath string? 视频缩略图路径(仅视频,file://协议)
duration number? 视频时长(秒,仅视频)
orientation number? 视频旋转角度(0/90/180/270,仅视频)

错误码

错误码 说明
9010002 Activity 为空或未知错误
9010003 所有已选文件压缩后仍超过maxSize限制

默认配置 mediaConfig

插件内置一套深色主题,可通过config参数覆盖任意属性。以下是默认值及说明:

export const mediaConfig: MediaConfig = {
  // 主题
  primary: "#F94258",                // 主色(按钮高亮、选中指示器)
  // 背景
  bgColor: "#181818",               // 网格列表背景
  navBarBgColor: "#222222",         // 顶部导航栏背景
  bottomBarBgColor: "#222222",      // 底部操作栏背景
  // 文字颜色
  textColor: "#FFFFFF",             // 主文字
  textColorSecondary: "#999999",    // 次级文字
  textColorDisabled: "#555555",     // 禁用态文字
  // 蒙层/占位
  selectedMaskColor: "#80000000",   // 已选蒙层底色
  imagePlaceholderColor: "#000000", // 缩略图加载占位色
  videoTagBgColor: "#40000000",     // 视频时长角标底色
  // 复选框样式
  checkboxBgColor: "#33000000",     // 未选中填充色
  checkboxStrokeColor: "#FFFFFF",   // 未选中描边色
  // 按钮
  buttonInactiveColor: "#666666",   // 发送按钮未激活底色
  // 相册菜单
  albumMenuDividerColor: "#333333", // 菜单分割线
  albumMenuBgColor: "#000000",      // 菜单背景
  // 预览界面
  previewNavBarBgColor: "#c0000000",    // 预览导航栏背景
  previewBottomBarBgColor: "#c0000000", // 预览底部条背景
  previewBgColor: "#000000",            // 预览页底色
  // 复选框尺寸/触摸区域(单位 px)
  checkboxSize: 50,
  checkboxTouchAreaSize: 40,
  checkboxTouchPaddingV: 20,
  checkboxTouchPaddingH: 20,
  // 网格
  gridColumnCount: 4,               // 每行图片数
  // 字号(sp)
  textSizeTitle: 17.0,
  textSizeBody: 15.0,
  textSizeTiny: 10.0,
  // 分页
  pageSize: 60,                     // 每页加载数量
  preloadThreshold: 50,             // 距底部多少px触发预加载
  // 压缩
  compressionQuality: 70,           // JPEG 压缩质量(0-100)
};

示例:仅选择视频,限制大小,自定义主题

const res = await chooseMedia({
  count: 3,
  mediaType: ['video'],
  maxSize: 50 * 1024 * 1024, // 50MB
  extension: ['mp4', 'mov'],
}, {
  ...mediaConfig,
  primary: '#34C759',
  previewBottomBarBgColor: '#50000000',
});

if (res) {
  res.forEach(file => {
    console.log(`视频: ${file.name}, 大小: ${file.size}, 时长: ${file.duration}s, 缩略图: ${file.thumbTempFilePath}`);
  });
}

平台兼容性

uni-app(3.99)

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

uni-app x(3.99)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
× × 5.0 1.0.0 × × ×

其他

多语言 暗黑模式 宽屏模式
× ×

l-media

开发文档

UTS 语法 UTS API插件 UTS uni-app兼容模式组件 UTS 标准模式组件 Hello UTS

隐私、权限声明

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

Android 12(API 31)及以下: READ_EXTERNAL_STORAGE -- 用于读取相册中的图片和视频。 WRITE_EXTERNAL_STORAGE -- 插件中有使用缓存,所以Android 9及以下需要写入权限 Android 13(API 33)及以上 READ_MEDIA_IMAGES READ_MEDIA_VIDEO 需要特别注意:本插件需要同时获取媒体权限和文件权限!!! 有些安卓申请媒体权限的时候会自动获取文件权限,但是有些安卓媒体和文件权限是分开的,所以需要特别注意一下。

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

插件不采集任何数据

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

暂无用户评论。