小程序部分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
英文地址,請注明出處:http://en.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;正式進軍該領域。經過數年技術…