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

server/2024/10/17 10:35:17/

目录

效果描述

效果展示

代码实现

渲染层

逻辑层


效果描述

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

如果录制时间 小于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/server/132457.html

相关文章

【Flutter】Dart:异常

在软件开发中&#xff0c;程序可能会遇到意外的错误或异常情况&#xff0c;导致无法继续正常执行。这种情况称为异常。为了增强程序的鲁棒性&#xff0c;Dart 提供了强大的异常处理机制。通过处理异常&#xff0c;我们可以在程序运行过程中捕获并应对各种错误&#xff0c;防止应…

外包干了5天,技术明显退步

我是一名本科生&#xff0c;自2019年起&#xff0c;我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定&#xff0c;但日复一日的重复性工作让我逐渐陷入了舒适区&#xff0c;失去了前进的动力。两年的时光匆匆流逝&#xff0c;我却在原地踏步&#xff0c;技术没有丝毫…

React之组件渲染性能优化

关键词&#xff1a; shouldComponentUpdate、PureComnent、React.memo、useMemo、useCallback shouldComponentUpdate 与 PureComnent shouldComponentUpdate 与 PureComnent 用于类组件。虽然官方推荐使用函数组件&#xff0c;但我们依然需要对类组件的渲染优化策略有所了解…

【Linux 从基础到进阶】AppArmor 安全模块应用指南

AppArmor 安全模块应用指南 1. 引言 AppArmor&#xff08;Application Armor&#xff09;是Linux系统中的强制访问控制&#xff08;MAC&#xff09;框架&#xff0c;旨在增强系统安全性。与SELinux不同&#xff0c;AppArmor通过配置文件&#xff08;profile&#xff09;定义具…

笔记-Python爬虫技术基础及爬取百度新闻

笔记-Python爬虫技术基础及爬取百度新闻 1.1查看网页源代码1.2网页结构初步了解1.3HTML基础知识1.标题<h>标签&#xff1a;2.段落<p>标签&#xff1a;3.链接<a>标签&#xff1a;(定义链接)4.区块&#xff1a;5.类&#xff08;class&#xff09;与 ID 1.4百度…

vue 动态适配宽高 echarts适配自适应字体字号

vue 动态适配宽高 echarts适配自适应字体字号 工具autoFontSize.js export function autoFontSize(res) {let clientWidth window.innerWidth ||document.documentElement.clientWidth ||document.body.clientWidth;if (!clientWidth) return;// 此处的3840 为设计稿的宽度&a…

开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现离线推理-Tools助力(二)

一、前言 在大语言模型推理中使用工具可以增强模型的能力和准确性,使其能够执行特定任务、获取实时信息、提高效率并降低计算负担,同时改善用户交互体验和灵活性,从而显著提升模型的实用性和性能。 二、术语 2.1. vLLM vLLM是一个开源的大模型推理加速框架,通过PagedAtten…

Python单例模式(三种实现方式:覆写__new__方法、使用装饰器、使用元类)(单例模式之线程安全)(单例的懒汉模式与饿汉模式)

文章目录 Python单例模式详解介绍单例模式的用途- 当类的构造函数被标记为私有时&#xff0c;保证无法在类外部实例化。- 当系统中的某个类只需要一个全局实例时&#xff0c;例如配置管理器、线程池等。- 资源共享&#xff0c;例如全局缓存、全局状态管理等。 实现单例模式使用…