小程序部分pai

wx.setClipboardData

这是微信小程序提供的 API,用于将数据复制到剪贴板。

Page({data: {clientInfo: {email: 'example@example.com' // 假设的邮箱数据}},// 复制邮箱到剪贴板copyEmail: function() {wx.setClipboardData({data: this.data.clientInfo.email,success(res) {console.log('邮箱复制成功');wx.showToast({title: '已复制邮箱',icon: 'success'});},fail(err) {console.error('复制失败:', err);wx.showToast({title: '复制失败',icon: 'none'});}});}
});

wx.saveImageToPhotosAlbum

功能:

  • 将指定 URL 的图片保存到用户相册。
  • 要处理用户未授权时的逻辑,引导用户开启相册权限。
wx.saveImageToPhotosAlbum({filePath: url,success: () => {// 保存成功},fail: (err) => {// 没有权限,弹出提示请求授权if (err.errMsg.includes("auth denied") || err.errMsg.includes("authorize no response")) {wx.showModal({title: '提示',content: '需要您授权保存相册',success: (res) => {if (res.confirm) {wx.openSetting({success: (settingdata) => {if (settingdata.authSetting['scope.writePhotosAlbum']) {this.savePosteToPhoto(url); // 重新尝试保存} else {wx.showToast({ title: '获取权限失败', icon: 'none', duration: 3000 });}}});} else {//取消授权wx.showToast({ title: '取消授权', icon: 'none', duration: 3000 });}},fail: () => {wx.showToast({ title: '取消授权', icon: 'none', duration: 3000 });}});} else {wx.showToast({ title: '取消保存', icon: 'none', duration: 3000 });}}
});

wx.showShareImageMenu)

功能:

  • 调起微信分享图片的菜单。
  • 需要用户主动触发(如按钮点击),否则无法使用。

wx.showShareImageMenu({path: url // 指定分享的图片路径
});

wx.downloadFile + wx.saveVideoToPhotosAlbum 下载文件并保存到相册

 //下载文件
wx.downloadFile({url: url,success: (res) => {//保存到相册wx.saveVideoToPhotosAlbum({filePath: res.tempFilePath,success: () => {wx.showToast({ title: '保存成功', icon: 'success' });},fail: (err) => {//没有权限,需要授权if (err.errMsg.includes("auth denied") || err.errMsg.includes("authorize no response")) {wx.showModal({title: '提示',content: '需要您授权保存相册',success: (res) => {if (res.confirm) {wx.openSetting({success: (settingdata) => {if (settingdata.authSetting['scope.writePhotosAlbum']) {this.save(); // 授权后,重新保存} else {wx.showToast({ title: '获取权限失败', icon: 'none', duration: 3000 });}}});} else {wx.showToast({ title: '取消授权', icon: 'none', duration: 3000 });}}});} else {wx.showToast({ title: '取消保存', icon: 'none', duration: 3000 });}}});}
});

使用原生的小程序开发进行if判断时,就会出现嵌套,代码的可读性也就会变差,如果把他们封装成函数,上面的授权过程就会好理解些,为了理解这个过程,这里不用小程序的格式封装了,在小程序中不能这样写,这里只是一个例子。
总结下来一共就进行了三步:

  • downloadFile下载文件,
  • 确认有没有保存到相册的权限,没有就授权,
  • 保存到相册
// 公共函数:处理相册权限
function checkPhotoAlbumPermission(successCallback) {wx.showModal({title: '提示',content: '需要您授权保存相册',success: (res) => {if (res.confirm) {wx.openSetting({success: (settingdata) => {if (settingdata.authSetting['scope.writePhotosAlbum']) {successCallback(); // 授权成功后执行回调} else {wx.showToast({ title: '获取权限失败', icon: 'none', duration: 3000 });}}});} else {wx.showToast({ title: '取消授权', icon: 'none', duration: 3000 });}}});
}// 保存图片到相册
function saveImage(url) {wx.saveImageToPhotosAlbum({filePath: url,success: () => wx.showToast({ title: '保存成功', icon: 'success' }),fail: (err) => {if (err.errMsg.includes("auth denied")) {checkPhotoAlbumPermission(() => saveImage(url));} else {wx.showToast({ title: '保存失败', icon: 'none', duration: 3000 });}}});
}// 下载并保存视频
function saveVideo(videoUrl) {wx.downloadFile({url: videoUrl,success: (res) => {wx.saveVideoToPhotosAlbum({filePath: res.tempFilePath,success: () => wx.showToast({ title: '保存成功', icon: 'success' }),fail: (err) => {if (err.errMsg.includes("auth denied")) {checkPhotoAlbumPermission(() => saveVideo(videoUrl));} else {wx.showToast({ title: '保存失败', icon: 'none', duration: 3000 });}}});},fail: () => {wx.showToast({ title: '下载失败', icon: 'none', duration: 3000 });}});
}

录音

// 初始化录音管理器
const recorderManager = wx.getRecorderManager();// 开始录音startRecord() {// 设置一些参数const options = {    duration: 60000,       // 最长 60 秒sampleRate: 16000,     // 采样率 16kHznumberOfChannels: 1,   // 单声道encodeBitRate: 96000,  // 编码码率 96kbpsformat: "mp3",         // 音频格式frameSize: 50,         // 帧大小 50KB};// 检查麦克风权限wx.getSetting({success: (res) => {if (!res.authSetting["scope.record"]) {wx.authorize({scope: "scope.record",success: () => {recorderManager.start(options);this.startCountDown();},fail: () => {wx.showToast({ title: "未授权麦克风权限", icon: "none" });},});} else {// 开始录音recorderManager.start(options);// 设置倒计时this.startCountDown();}},});},// 开始计时startCountDown() {let seconds = 0;const maxTime = 60this.recordTimer = setInterval(() => {seconds++;// 到时间停止录音if (seconds > maxTime) {clearInterval(this.recordTimer);recorderManager.stop();return;}// 格式化显示时间(00:00)const minutes = Math.floor(seconds / 60);const remainingSeconds = seconds % 60;const displayTime = `${minutes.toString().padStart(2, "0")}:${remainingSeconds.toString().padStart(2, "0")}`;this.setData({"duration": displayTime,});}, 1000);},// 停止录音endRecord() {clearInterval(this.recordTimer);recorderManager.stop();},// 上传录音文件uploadAudio(tempFilePath) {wx.showLoading({ title: "上传中...", mask: true });wx.uploadFile({filePath: tempFilePath,url: "https://example.com/api/uploadVoice",name: "file",header: {"content-type": "multipart/form-data","token": "YOUR_TOKEN",},formData: {},success: (res) => {const response = JSON.parse(res.data);if (response.code === 0) {wx.showToast({ title: "上传成功", icon: "success" });} else {wx.showToast({ title:  "上传失败", icon: "none" });}},fail: (err) => {wx.showToast({ title: "网络错误", icon: "none" });},complete: () => {wx.hideLoading();},});},

播放音频

 // 创建一个微信小程序的音频上下文对象。//wx.createInnerAudioContext:微信小程序的 API,用于创建音频播放实例。// useWebAudioImplement: false:指定不使用 WebAudio 实现,而是使用原生实现。
const speakerAudioContext = wx.createInnerAudioContext({ useWebAudioImplement: false });onLoad() {// 监听音频事件this.setupAudioEvents();},
});
//监听时间,这里有个坑,有时候监听事件不生效,监听的时机不对
setupAudioEvents() {// 播放开始speakerAudioContext.onPlay(() => {});});// 播放结束speakerAudioContext.onEnded(() => {});// 播放错误speakerAudioContext.onError((err) => {console.error("音频播放错误", err);});
},// 播放音频
playVoice() {//暂停时重新播放if (this.data.voicePause) {speakerAudioContext.play(); // 继续播放//其他操作} else {//播放新的speakerAudioContext.src =  ‘xxx’speakerAudioContext.play();}
},// 暂停音频
pauseVoice() {speakerAudioContext.pause();// 其他操作
},// 停止音频
stopVoice() {speakerAudioContext.stop();// 其他操作
},
// 调整音量
setVolume(e) {speakerAudioContext.volume = 1; 
},

订阅消息

Page({data: {// 订阅消息模板 ID(需从微信公众平台获取)tmplIds: ["HURj2vKkoldzDj9LVLz59jLq2WPZCBxbkDS5qbYzHTE"],},// 订阅消息主流程subscribeProc() {const { tmplIds } = this.data;// 1. 检查订阅权限wx.getSetting({withSubscriptions: true,success: (res) => {const status = res.subscriptionsSetting[tmplIds[0]];// 情况 1:用户已拒绝,引导打开设置页if (status === "reject" || status === "ban") {this.showAuthModal();} // 情况 2:未拒绝,直接弹窗订阅else {this.requestSubscribe();}},fail: (err) => {console.error("检查权限失败", err);wx.showToast({ title: "检查权限失败", icon: "none" });},});},// 显示授权引导弹窗showAuthModal() {wx.showModal({title: "订阅权限已关闭",content: "需要您授权订阅消息,是否去设置打开?",confirmText: "去设置",success: (res) => {if (res.confirm) {wx.openSetting({success: (res) => {console.log("用户已打开设置页", res);},});}},});},// 请求订阅消息requestSubscribe() {const { tmplIds } = this.data;wx.requestSubscribeMessage({tmplIds: tmplIds,success: (res) => {const status = res[tmplIds[0]];console.log("订阅结果", res);// 用户同意订阅if (status === "accept") {wx.showToast({ title: "订阅成功", icon: "success" });this.subscribeSend(); // 执行订阅后的逻辑} // 用户拒绝订阅else {wx.showToast({ title: "已取消订阅", icon: "none" });}},fail: (err) => {console.error("订阅失败", err);wx.showToast({ title: "订阅失败", icon: "none" });},});},// 订阅成功后发送消息(示例)subscribeSend() {wx.request({url: "https://example.com/api/sendSubscribeMsg",method: "POST",data: {tmplId: this.data.tmplIds[0],userId: "123",},success: (res) => {console.log("消息发送成功", res);},fail: (err) => {console.error("消息发送失败", err);},});},
});

选择照片,并上传

wx.chooseImage({count: 1,sizeType: ['original'],sourceType: ['album', 'camera'],success(res) {console.log(res)  const src = res.tempFilePaths[0];wx.uploadFile({url: url,filePath: src,name: "file",header: {"content-type":"multipart/form-data",'token': token,}, // 按需success: (res) => {},fail: (err) => {console.log(err)}})}})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91577.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解决方案】鸿蒙 / 矿鸿系统 Shell 无故退出问题(息屏导致)详解

平台环境 OpenHarmony 版本:4.1 release开发板:DAYU / RK3568调试工具:hdc 在使用 OpenHarmony 4.1 Release(矿鸿系统)进行开发时,遇到这样的问题: 🚨 Shell 会在一段时间后自动退出…

Data Analysis TTAD=>CNN-BiGRU-MSA

TTAO 预处理、CNN-BiGRU-MSA 模型 时序数据回归分析时序数据分析方法,特点:TTAO 预处理:通过三角拓扑结构增强时序特征的局部和全局关系混合模型架构:CNN 层提取局部特征模式BiGRU 捕获双向时序依赖多头自注意力机制进行序列建模…

python-字典、集合、序列切片、字符串操作(笔记)

一、字符串常见操作(重点)​1.​2.字符串无法修改#错误示范 str1"djskds" str1[2]"3"3.​str1"abcand" # 输出3 print(str1.index("and"))4.​str1"abcand" newStrstr1.replace("and",&quo…

【Android】EditText使用和监听

三三想成为安卓糕手 一&#xff1a;用户登录校验 1&#xff1a;EditText文本输入框<EditTextandroid:id"id/et_user_name"android:layout_width"match_parent"android:layout_height"wrap_content"android:inputType"number"androi…

SQL 中根据当前时间动态计算日期范围

在 SQL 中写“动态时间”通常是指根据当前时间动态计算日期范围&#xff0c;而不是写死固定日期。以下是几种常见写法&#xff08;以 SQL Server / MySQL / PostgreSQL 为例&#xff09;&#xff1a;1. 获取当前时间-- SQL Server SELECT GETDATE() AS now-- MySQL SELECT NOW(…

react-redux 类组件的 connect

store 目录下 store/reducer.js import * as actionTypes from ./constantsconst initalState {counter: 100,banners: [],recommends: [] }/*** 定义reducer函数&#xff1a;纯函数* param 参数一&#xff1a;store中目前保存的state* param 参数二&#xff1a;通过 dispatch…

数据分布是如何影响目标检测精度

文章目录一、研究背景与目标模型效果提升数据集优化二、研究问题明细各方向的关联性与核心逻辑1. 高质量数据集的高效筛选与主动学习应用2. 基于推理结果的数据补充与增强方向优化3. 多类别场景下目标尺度与模型精度的关联性4. 损失函数与数据增强对精度的量化影响5. 目标类型专…

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南 在AI大模型技术飞速发展的今天,企业需要将现有Java接口快速适配为模型计算协议(MCP,Model Calculation Protocol)服务,以便与大模型生态无缝对接。然而,手动逐个转换接口不仅耗时耗力,还容易因人为疏忽导致错误…

Eclipse Debug 配置指南

Eclipse Debug 配置指南 引言 Eclipse 作为一款功能强大的集成开发环境(IDE),在Java开发者中享有盛誉。在开发过程中,调试功能是必不可少的。本文将详细介绍如何在Eclipse中配置调试环境,以便更高效地进行代码调试。 1. 开发环境准备 在开始配置Eclipse调试环境之前,…

modelscope ProxyError: HTTPSConnectionPool(host=‘www.modelscope.cn‘, port=443)

目录 Windows CMD&#xff1a; powershell Linux / macOS / Git Bash&#xff1a; win11 设置全局系统变量代理 modelscope ProxyError: HTTPSConnectionPool(hostwww.modelscope.cn, port443) 报错&#xff1a; requests.exceptions.ProxyError: HTTPSConnectionPool(host…

Python学习之——序列化与反序列化

Python学习之——序列化与反序列化yaml & json & xmlyamljsonPython自带Json库xml一个综合示例pickle & msgpack & marshalpicklemsgpackmarshal自定义导出py文件一个导出py文件的示例yaml & json & xml YAML & JSON &XML 如何选择 yaml Py…

设计模式之代理模式:掌控对象访问的优雅之道

代理模式&#xff1a;掌控对象访问的优雅之道 引言&#xff1a;设计模式的重要性 在软件开发中&#xff0c;设计模式是解决常见问题的可复用方案&#xff0c;它们如同建筑师的蓝图&#xff0c;为开发者提供了经过验证的最佳实践。在23种经典设计模式中&#xff0c;代理模式因其…

sqli-labs靶场通关笔记:第18-19关 HTTP头部注入

第18关 User-Agent注入登录正确的用户名密码&#xff0c;它会将User-Agent的信息回显到页面上。猜测UA头可能存在注入点。利用bp抓包&#xff0c;在UA头后面加一个单引号&#xff0c;发现报错了。观察报错信息&#xff0c;显示nearxx,admin)&#xff0c;推测后面应该还有两个参…

基于按键开源MultiButton框架深入理解代码框架(三)(指针的深入理解与应用)

文章目录3、分析代码3.3 按键的插入3.4 按键的删除3.5 继续分析状态机核心理解4、写在最后的总结5、思想感悟篇6、慈悲不渡自绝人3、分析代码 3.3 按键的插入 // Button handle list headstatic Button* head_handle NULL;/*** brief Start the button work, add the handle…

ACOUSLIC-AI挑战报告:基于低收入国家盲扫超声数据的胎儿腹围测量|文献速递-医学影像算法文献分享

Title题目ACOUSLIC-AI challenge report: Fetal abdominal circumferencemeasurement on blind-sweep ultrasound data from low-income countriesACOUSLIC-AI挑战报告&#xff1a;基于低收入国家盲扫超声数据的胎儿腹围测量01文献速递介绍胎儿生长受限&#xff08;FGR&#xf…

集群聊天服务器各个类进行详解

1.dh.h类定义概要类名&#xff1a; MySQL功能&#xff1a; 简化MySQL的连接、查询和更新操作&#xff0c;提供接口给上层应用使用。成员变量private:MYSQL *_conn;_conn&#xff1a;指向MYSQL结构体的指针&#xff0c;用于代表数据库连接实例。由mysql_init()初始化&#xff0c…

电缆安全双保险:不止防盗,更能防触电的塔能智慧照明守护方案

城市照明、地下车库以及园区路灯所涉及的电缆安全问题&#xff0c;向来都是运维管理方面颇为棘手的难题。在传统的运维管理模式之下&#xff0c;电缆一旦被盗&#xff0c;那么所造成的影响可不小&#xff0c;一方面会带来直接的经济损失&#xff0c;另一方面还极有可能因为线路…

Leetcode刷题营第二十九,三十题:二叉树的中序以及后序遍历

94.二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#x…

Rabbitmq Direct Exchange(直连交换机)可以保证消费不被重复消费吗,可以多个消费者,但是需要保证同一个消息,不会被投递给多个消费者

在 RabbitMQ 中&#xff0c;默认情况下&#xff0c;不能保证消息不被重复消费&#xff0c;但可以通过 队列绑定方式 消费者竞争机制 来确保 同一消息只被一个消费者处理。以下是几种可行的方案&#xff1a;方案 1&#xff1a;单队列 竞争消费者模式&#xff08;默认行为&…

常用的OTP语音芯片有哪些?

唯创知音在 OTP 语音芯片有着26年的历史&#xff0c;有着丰富的技术积累与产品迭代历程。1999 年&#xff0c;唯创知音在广州成立&#xff0c;彼时便开始在电子领域积极探索。2000 年&#xff0c;公司敏锐捕捉到语音芯片行业的发展潜力&#xff0c;正式进军该领域。经过数年技术…