微信小程序-相册选择/拍摄图片或视频封装函数

一、前言

本文实现的功能是:在小程序中通过拍照或者相册选择照片的函数封装,基于最新的API:wx.chooseMedia()

之前的博客封装过基于wx.chooseImage()的图片选择函数,但是该函数目前已经停止维护,所以重新封装了一个。

函数使用效果如下

悬停时会有参数提示,参数做了简化,方便使用时调用

二、封装的函数代码

函数的注释非常详细,有定制需求的同学可以自行修改代码。调用时悬停或输入参数时会有相应的提示。同时也做了基础库的判断。

javascript 复制代码
  /**
   * 选择图片或视频
   * @param {*} count 文件数量 1-20 基础库2.25.0+ 上限为20 否则为 9
   * @param {*} mediaType 可选择的文件类型 1仅图片 2仅视频 3图片和视频
   * @param {*} sourceType 文件的来源 1仅相册 2仅拍摄 3相册或拍摄
   * @param {*} sizeType 文件是否压缩 1原文件 2压缩 3由用户可选择
   * @param {*} maxDuration 拍摄时视频的时长 3-60s(相册选择不限制)
   * @param {*} cameraType 拍摄时使用前/后相机 1后摄 2前摄
   */
  async chooseMedia(
    count = 1,
    mediaType = 1,
    sourceType = 3,
    sizeType = 3,
    maxDuration = 10,
    cameraType = 1
  ) {
    if (count <= 0) count = 1;
    // 版本比较 2.25.0+ 上限为20
    if (count > 9) {
      const { SDKVersion } = wx.getSystemInfoSync();
      const vRes = compareVersion(SDKVersion, "2.25.0");
      if (vRes < 0 && count >= 20) count = 9;
      else if (vRes >= 0 && count > 20) count = 20;
    }

    // 可选择的文件类型
    let _mediaType = [];
    if (mediaType === 1) _mediaType = ["image"]; // 仅图片
    if (mediaType === 2) _mediaType = ["video"]; // 仅视频
    if (mediaType === 3) _mediaType = ["mix"]; // 图片或视频

    // 文件的来源
    let _sourceType = [];
    if (sourceType === 1) _mediaType = ["album"]; // 仅相册
    if (sourceType === 2) _mediaType = ["camera"]; // 仅相机拍摄
    if (sourceType === 3) _mediaType = ["album", "camera"]; // 相册或相机拍摄

    // 上传压缩或原图
    let _sizeType = [];
    if (sizeType === 1) _sizeType = ["original"];
    if (sizeType === 2) _sizeType = ["compressed"];
    if (sizeType === 3) _sizeType = ["original", "compressed"];

    let _cameraType = "back";
    if (cameraType === 1) _cameraType = "back";
    if (cameraType === 2) _cameraType = "front";

    if (maxDuration < 3) maxDuration = 3;
    if (maxDuration > 60) maxDuration = 60;

    return await wx
      .chooseMedia({
        count,
        mediaType: _mediaType,
        sourceType: _sourceType,
        cameraType: _cameraType,
        maxDuration,
      })
      .then((res) => {
        return res;
      })
      .catch((err) => {
        return err;
      });

    /**
     * 版本比较
     * v1 >= v2 返回 0或1 否则 -1
     * @param {String} v1
     * @param {String} v2
     */
    function compareVersion(v1, v2) {
      v1 = v1.split(".");
      v2 = v2.split(".");
      const len = Math.max(v1.length, v2.length);

      while (v1.length < len) {
        v1.push("0");
      }
      while (v2.length < len) {
        v2.push("0");
      }

      for (let i = 0; i < len; i++) {
        const num1 = parseInt(v1[i]);
        const num2 = parseInt(v2[i]);
        if (num1 > num2) {
          return 1;
        } else if (num1 < num2) {
          return -1;
        }
      }
      return 0;
    }
  },

三、结语

最后来一下常规结语:

实际开发中的其他逻辑就不写了。需要同学们自己去考虑异常情况处理等问题啦。

有任何疑问可以在评论区留下。我每天都会进行回复,私聊不回。(为了刷积分)

以上均是本人开发过程中的一些经验总结与领悟,如果有什么不正确的地方,希望大佬们评论区斧正。

💥最后!!!不管这篇文章对你有没有用,既然都看到最后了。

👍赞一个!!!

🤩当然,顺带收藏就最好了。

😎欢迎转载,原创不易,转载请注明出处✍️。

😊如果你对小程序开发有兴趣或者正在学习小程序开发,可以关注我。每一篇都是原创,每一篇都是干货噢~。


版权声明:本文为CSDN博主「super--Yang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_44702572/article/details/135141353

相关推荐
sinat_267611916 小时前
用 AI 开发微信小程序(八):一个极简收纳工具的开发复盘
微信小程序·小程序
李纲明17 小时前
微信小程序真机预览白屏或 request 失败:先核 request 合法域名与 TLS,再查体验版与本地缓存
缓存·微信小程序·小程序·小程序开发·devdiy·真机预览·合法域名
klfdgl18 小时前
线上商城小程序投入测算,有成熟开发经验服务商的长期收益对比
小程序
一木 之林1 天前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
赵小哥要冲啦2 天前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
河北清兮网络科技2 天前
石家庄做一套企业知识库系统多少钱?2026 报价明细
小程序·短剧app·广告联盟
Ai-_Man2 天前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
微订校园外卖平台2 天前
新手做校园外卖平台:小程序启动顺序与订单链路验收
小程序·外卖系统·本地生活·微订
计算机毕设定制辅导-无忧学长2 天前
《基于物品协同过滤的闲置书换购微信小程序设计开发》
java·vue.js·spring boot·微信小程序·uniapp·闲置书换购微信小程序·物品协同过滤算法
ngaiwe2 天前
AA我来算小程序实践:把付款人、承担人和结算状态分开建模
微信小程序