在uniapp中实现即时通讯中的【发送语音】

news/2024/10/16 0:13:30/

目录

效果描述

效果展示

代码实现

渲染层

逻辑层


效果描述

在与好友的对话框中,点击语音图标可以切换到给好友发送语音,长按发送语音的按钮即可开始录音:

如果录制时间 小于60s 时,松手则表示录音结束并将语音消息发送给对方;

如果录制的时间 超过60s 则自动结束,并将语音发送给对方;

如果在录制 60s之内 并且没有松手,而是上滑100像素,则表示取消发送该条语音;

效果展示

默认页面
语音消息录制中
取消发送
发送成功

代码实现

发送语音部分的代码是全的,但是别的部分代码有缺失,如果需要对话框页面完整代码的可以私信。

渲染层

    <view class="guding"><view class="bottom" :style="bottomStyle"><view class="mic"><uv-icon name="mic" color="#09B5BE" size="50rpx" v-if="!isVoice" @click="handleVoice(true)"></uv-icon><image src="../../static/message/keyboard.svg" mode="aspectFill" class="img" v-if="isVoice"@click="handleVoice(false)"></image></view><view class="b-cen" v-if="!isVoice"><!-- autoHeight:是否自动增加高度,设置auto-height时,height不生效 --><uv-textarea ref="textarea" v-model="msgText" autoHeight border="none" @input="input" :adjustPosition="true"@focus="focus" @blur="blur" :showConfirmBar="false" maxlength="100":customStyle="{minHeight:'30rpx',borderRadius:'20rpx'}" :textStyle="{fontSize:'30rpx'}"></uv-textarea><image v-if="isShowSmile" src="../../static/message/smile.svg" mode="aspectFill" class="img"@click="handleKeySmile('smile')"></image><image v-if="isShowKeyboard" src="../../static/message/keyboard.svg" mode="aspectFill" class="img"@click="handleKeySmile('key')"></image></view><view v-if="isVoice" class="b-cen"><view class="bc-text" @touchstart="touchstart" @touchend="touchend" @touchmove="touchmove">按住 说话</view></view><view v-if="!msgText.length" class="mic" @click="handlePlus"><uv-icon name="plus" color="#09B5BE"size="50rpx"></uv-icon></view><view class="sendBtn" v-if="msgText.length" @click="handleSubmit">发送</view></view><view class="emoji" v-if="!isShowSmile"><text class="e-item" v-for="(item,index) in emojiList" :key="index" @click="handleEmoji(item)">{{item}}</text></view><view class="extra" v-if="isShowExtra"><view v-for="item in extraList" :key="item.id" class="ex-item" @click="handleExtra(item)"><uv-icon :name="item.icon" size="74rpx"></uv-icon><text>{{item.text}}</text></view></view></view>

逻辑层

  const recorderManager = ref('');const isVoice = ref(false) //是否显示语音const isshowVoiceBg = ref(false) //是否显示录音背景// 切换语音和键盘const handleVoice = (val) => {isVoice.value = valisShowExtra.value = falseinputh.value = 0isShowSmile.value = trueisShowKeyboard.value = falseif (val) {uni.authorize({scope: 'scope.record',desc: '需要获取您的录音权限',fail(res) {uni.showToast({title: "请点击右上角“…”功能菜单,进入设置界面,打开麦克风权限后,再重新录音",icon: "none",duration: 2000,});return false;},})}}const pageY = ref(0)const timer = ref(0) //计时器const vlength = ref(0) //录音时长// 点击开始录制语音const touchstart = (e) => {console.log("开始录制", e)let i = 1;timer.value = setInterval(() => {vlength.value = i;i++;console.log("计时器开始工作,第几秒", i)//结束计时,如果录制时间超过60s就强制停止录音if (i > 60) {clearInterval(timer.value);touchend();}}, 1000)recorderManager.value.start();pageY.value = e.changedTouches[0].pageY;isshowVoiceBg.value = true}const isCancel = ref(false)const recordSend = ref(true)// 结束录音const touchend = async (e) => {console.log("结束录制", e)recorderManager.value.stop();clearInterval(timer.value)isshowVoiceBg.value = false// 如果取消发送录音,则不发送if (isCancel.value) {recordSend.value = false} else {recordSend.value = true}// 结束录音后重置取消状态isCancel.value = false}// 删除录音const touchmove = (e) => {console.log('删除录音')// 如果手指移动距离大于100,则关闭录音界面if (pageY.value - e.changedTouches[0].pageY > 100) {// 关闭录音界面isshowVoiceBg.value = falseisCancel.value = true}}onMounted(() => {recorderManager.value = uni.getRecorderManager()// 处理录音停止的逻辑recorderManager.value.onStop(async (res) => {console.log("录制结束后生成的声音文件", res, vlength.value)await http.uploadFile(api.singleUpload, res.tempFilePath).then(res => {console.log("录制的时长为多少", vlength.value)let data = {voice: res.data.filePath,time: vlength.value};if (recordSend.value) {sendMsg({ type: 2, message: JSON.stringify(data) }) //语音} else {uni.showToast({icon: "none",title: "语音已取消发送"})}})// 重置时长和状态vlength.value = 0;isshowVoiceBg.value = false});})


http://www.ppmy.cn/news/1539672.html

相关文章

机器人研究不同模态之间的融合方法

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 机器人研究不同模态之间的融合方法 在机器人研究中&#xff0c;不同模态之间的融合方法旨在使机器人能够通过多种感知模式&#xff08;如视觉、触觉、听觉等&#xff09;更好地感知和理解其环境。多模态融合技…

「从零开始的 Vue 3 系列:第七章——深入学习核心功能——Router(巨详细)

前言 本系列将从零开始&#xff0c;系统性地介绍 Vue 3 的常用 API&#xff0c;逐步深入每个核心概念与功能模块。通过详尽的讲解与实战演示&#xff0c;帮助大家掌握 Vue 3 的基础与进阶知识&#xff0c;最终具备独立搭建完整 Vue 3 项目的能力。 Vue核心功能之一Router ue…

【NTN 卫星通信】卫星通信的专利

1 概述 好久没有看书了&#xff0c;最近买了本讲低轨卫星专利的书&#xff0c;也可以说是一个分析报告。推荐给喜欢的朋友。 2 书籍截图 图1 封面 图2 波音低轨卫星专利演进 图3 低轨卫星关键技术专利发展阶段 图4 第一页 3 参考文献 产业专利分析报告–低轨卫星通信技术

java对接GPT 快速入门

统一对接GPT服务的Java说明 当前&#xff0c;OpenAI等GPT服务厂商主要提供HTTP接口&#xff0c;这使得大部分Java开发者在接入GPT时缺乏标准化的方法。 为解决这一问题&#xff0c;Spring团队推出了Spring AI &#xff0c;它提供了统一且标准化的接口来对接不同的AI服务提供商…

《OpenCV计算机视觉》—— 使用DNN模块实现图片风格迁移

文章目录 OpenCV中的DNN模块一、功能概述二、支持的模型格式三、基本使用方法四、DNN 模块的特点五、常见应用示例 示例&#xff1a;图片风格迁移 OpenCV中的DNN模块 OpenCV中的DNN&#xff08;Deep Neural Network&#xff09;模块是一个功能强大的工具&#xff0c;它允许开发…

【数学分析笔记】第5章第1节 微分中值定理(2)

5. 微分中值定理及其应用 5.1 微分中值定理 5.1.4 一阶导数与单调性的关系 【定理5.1.5】【一阶导数与单调性的关系】 f ( x ) f(x) f(x)在区间 I \textbf{I} I&#xff08;可以是开区间&#xff0c;也可以闭区间&#xff0c;也可以半开半闭区间&#xff09;定义且可导&…

有关vue路由的学习

导言 由于很久没碰前端了&#xff0c;碰到路由都不太会了。趁着后端对接来记录一下&#xff0c;就当复习。不过由于个人能力有限&#xff0c;这篇会偏向整个过程的实现逻辑&#xff0c;其中有很多具体的方法不会给来&#xff0c;有兴趣的可以去看一下源码~ 目的&#xff1a; …

【鱼类识别】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面+TensorFlow

一、介绍 鱼类识别系统。使用Python作为主要编程语言开发&#xff0c;通过收集常见的30种鱼类&#xff08;‘墨鱼’, ‘多宝鱼’, ‘带鱼’, ‘石斑鱼’, ‘秋刀鱼’, ‘章鱼’, ‘红鱼’, ‘罗非鱼’, ‘胖头鱼’, ‘草鱼’, ‘银鱼’, ‘青鱼’, ‘马头鱼’, ‘鱿鱼’, ‘鲇…