123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- <template>
- <view>
- <view class="text-white text-center" style="margin-top: 200rpx;">
- <view class="datt">严重危害生命财产安全 </view>
- <view class="datt margin-top-sm">求助专属通道</view>
- <!-- <view class="margin-top">平台将为您,保留录音证据,实时位置,通知平台联系人</view> -->
- </view>
- <!-- <view class="text-center" style="margin-top: 120rpx;" @touchstart.stop.prevent="voiceBegin"
- @touchmove.stop.prevent="voiceIng" @touchend.stop.prevent="voiceEnd"
- @touchcancel.stop.prevent="voiceCancel">
- <image src="../static/yuyin.png" style="width: 300rpx;height: 300rpx;pointer-events: none;"></image>
- </view> -->
- <!-- 录音UI效果 -->
- <!-- <view class="record" :class="recording?'':'hidden'">
- <view class="ing" :class="willStop?'hidden':''">
- <view class="icon luyin2"></view>
- </view>
- <view class="cancel" :class="willStop?'':'hidden'">
- <view class="icon chehui"></view>
- </view>
- <view class="tis" :class="willStop?'change':''">{{recordTis}}</view>
- </view> -->
- <!-- <view class="text-center" style="margin-top:200rpx;" @touchstart.stop.prevent="voiceBegin"
- @touchmove.stop.prevent="voiceIng" @touchend.stop.prevent="voiceEnd"
- @touchcancel.stop.prevent="voiceCancel">
- <image src="../static/sos.png" style="width: 200rpx;height: 200rpx;pointer-events: none;"></image>
- </view> -->
- <view class="text-center" @click="getPhoneNumber()" style="margin-top:200rpx;">
- <image src="../static/sos.png" style="width: 200rpx;height: 200rpx;pointer-events: none;"></image>
- </view>
- </view>
- </template>
- <script>
- import configdata from '@/common/config.js';
- var innerAudioContext; //播放
- // #ifdef H5
- var recorder; // 定义一个MediaRecorder对象
- var stream; //定义一个音频流的对象
- var chunks = []; // 定义一个用于存储音频数据片段的数组
- // #endif
- export default {
- data() {
- return {
- latitude: '',
- longitude: '',
- content: '',
- //录音相关参数
- //H5不能录音
- RECORDER: uni.getRecorderManager(),
- isVoice: false,
- voiceTis: '按住 说话',
- recordTis: "手指上滑 取消发送",
- recording: false,
- willStop: false,
- initPoint: {
- identifier: 0,
- Y: 0
- },
- recordTimer: null,
- recordLength: 0,
- //播放语音相关参数
- AUDIO: uni.createInnerAudioContext(),
- playMsgid: null,
- VoiceTimer: null,
- blobData: '',
- voicePaths: '',
- voicePath: '',
- phoneNumber: '',
- }
- },
- onLoad: function(option) {
- // this.$Request.getT('/app/common/type/425').then(res => {
- // if (res.code == 0) {
- // if (res.data && res.data.value && res.data.value == '是') {
- // this.isYuyin = res.data.value
- // // #ifndef H5
- // //录音开始事件
- // this.RECORDER.onStart((e) => {
- // this.recordBegin(e);
- // })
- // //录音结束事件
- // this.RECORDER.onStop((e) => {
- // this.recordEnd(e);
- // })
- // // #endif
- // }
- // }
- // });
- let that = this;
- // uni.getLocation({
- // type: 'wgs84',
- // success: function(res) {
- // console.log('当前位置的经度:' + res.longitude);
- // console.log('当前位置的纬度:' + res.latitude);
- // that.latitude = res.latitude
- // that.longitude = res.longitude
- // }
- // });
- },
- onBackPress() {
- this.AUDIO.stop();
- },
- onHide() {
- this.AUDIO.stop();
- },
- mounted() {
- innerAudioContext = uni.createInnerAudioContext(); //播放
- let _this = this;
- // #ifndef H5
- //录音停止事件
- // recorderManager.onStop(function(res) {
- // console.log('recorder stop' + res.tempFilePath);
- // // _this.recordEnd(res);
- // _this.voicePath = res.tempFilePath;
- // });
- // #endif
- },
- beforeDestroy() {
- // innerAudioContext.destroy();
- // var recorder; // 定义一个MediaRecorder对象
- // chunks = [];
- },
- methods: {
- //获取配置的求助电话
- getPhoneNumber() {
- this.$Request.getT('/app/common/type/444').then(res => {
- if (res.code == 0) {
- if (res.data && res.data.value) {
- uni.makePhoneCall({
- phoneNumber: res.data.value
- })
- }
- }
- });
- },
- // 切换语音/文字输入
- switchVoice() {
- this.isVoice = this.isVoice ? false : true;
- },
- setChatSave() {
- let userId = this.$queue.getData('userId');
- let userName = this.$queue.getData('nickName');
- let data = {
- image: this.content,
- state: 9,
- type: this.longitude,
- platform: this.latitude,
- userId: userId,
- userName: userName
- }
- this.$Request.postJson('/app/message/insertMessage', data).then(
- res => {
- if (res.code == 0) {
- this.$queue.showToast('上传成功!');
- } else {
- this.$queue.showToast(res.msg);
- }
- });
- },
- // 录音开始
- voiceBegin(e) {
- // #ifdef H5
- if (stream) {
- stream.getTracks().forEach((track) => track.stop())
- stream = null
- }
- if (recorder) {
- recorder = null
- }
- this.recordLength = 0
- this.voicePaths = '';
- this.voicePath = '';
- this.startRecord()
- // #endif
- if (e.touches.length > 1) {
- return;
- }
- this.initPoint.Y = e.touches[0].clientY;
- this.initPoint.identifier = e.touches[0].identifier;
- // #ifndef H5
- this.RECORDER.start({
- format: "mp3"
- }); //录音开始,
- // #endif
- },
- //开始录音
- startRecord: async function() {
- let _this = this
- // 获取麦克风音频数据流
- stream = await navigator.mediaDevices.getUserMedia({
- audio: true
- })
- // 初始化MediaRecorder对象
- recorder = new MediaRecorder(stream);
- console.log('asdsad___' + recorder)
- // alert('asdsad___' + recorder)
- // 将 stream 转成 blob 来存放
- recorder.ondataavailable = (blobEvent) => {
- chunks.push(blobEvent.data);
- }
- // 停止时生成预览的 blob url
- recorder.onstop = () => {
- const blob = new Blob(chunks, {
- type: 'audio/mp3'
- })
- // const mediaUrl = URL.createObjectURL(blob);
- _this.voicePaths = blob;
- _this.blobData = blob;
- // that.voicePath = mediaUrl;
- // const newbold = new File([recordPath]),{type:'audio/mp3'}
- // alert(that.voicePaths,URL.createObjectURL(blob))
- }
- recorder.start();
- _this.recordBegin()
- },
- //录音开始UI效果
- recordBegin(e) {
- this.recording = true;
- this.voiceTis = '松开 结束';
- this.recordLength = 0;
- this.recordTimer = setInterval(() => {
- this.recordLength++;
- }, 1000)
- },
- // 录音被打断
- voiceCancel() {
- this.recording = false;
- this.voiceTis = '按住 说话';
- this.recordTis = '手指上滑 取消发送'
- this.willStop = true; //不发送录音
- this.RECORDER.stop(); //录音结束
- },
- // 录音中(判断是否触发上滑取消发送)
- voiceIng(e) {
- // // #ifdef H5
- // this.startRecord()
- // // #endif
- if (!this.recording) {
- return;
- }
- let touche = e.touches[0];
- //上滑一个导航栏的高度触发上滑取消发送
- if (this.initPoint.Y - touche.clientY >= uni.upx2px(100)) {
- this.willStop = true;
- this.recordTis = '松开手指 取消发送'
- } else {
- this.willStop = false;
- this.recordTis = '手指上滑 取消发送'
- }
- },
- // 结束录音
- voiceEnd(e) {
- if (!this.recording) {
- return;
- }
- this.recording = false;
- this.voiceTis = '按住 说话';
- this.recordTis = '手指上滑 取消发送'
- //原生录音停止
- // #ifdef H5
- //停止录音
- if (recorder.state != "inactive") {
- recorder.stop();
- }
- //把音频流也停止掉
- stream.getTracks().forEach((track) => track.stop())
- this.uplodMp3(this.voicePaths);
- // #endif
- // #ifndef H5
- this.RECORDER.stop(); //录音结束
- // #endif
- },
- //录音结束(回调文件)
- recordEnd(e) {
- clearInterval(this.recordTimer);
- if (!this.willStop) {
- this.$queue.showLoading('发送中...')
- console.log("e: " + JSON.stringify(e));
- let msg = {
- length: 0,
- url: e.tempFilePath
- }
- let min = parseInt(this.recordLength / 60);
- let sec = this.recordLength % 60;
- min = min < 10 ? '0' + min : min;
- sec = sec < 10 ? '0' + sec : sec;
- if (this.recordLength % 60 > 1) {
- msg.length = min + ':' + sec;
- console.log('msg.length___:' + msg.length)
- uni.uploadFile({ // 上传接口
- url: this.config("APIHOST1") + '/alioss/upload', //真实的接口地址
- filePath: e.tempFilePath,
- name: 'file',
- success: (uploadFileRes) => {
- uni.hideLoading();
- this.content = JSON.parse(uploadFileRes.data).data;
- console.log("语音:" + this.content)
- this.setChatSave();
- uni.hideLoading();
- }
- });
- } else {
- this.$queue.showToast('语音要大于一秒才可以发送!')
- }
- } else {
- console.log('取消发送录音');
- }
- this.willStop = false;
- },
- //上传mp3格式的音频
- uplodMp3(recordPath) {
- let _this = this;
- // var newbold = new File([recordPath],{type:'audio/mp3'})
- clearInterval(_this.recordTimer);
- if (!_this.willStop) {
- // that.$queue.showLoading('发送中...')
- uni.showLoading({
- title: '录音上传中...'
- })
- let msg = {
- length: 0,
- url: recordPath
- }
- let min = parseInt(_this.recordLength / 60);
- let sec = _this.recordLength % 60;
- min = min < 10 ? '0' + min : min;
- sec = sec < 10 ? '0' + sec : sec;
- if (_this.recordLength % 60 > 1) {
- msg.length = min + ':' + sec;
- // console.log('msg.length___:' + msg.length)
- setTimeout(function() {
- uni.uploadFile({ // 上传接口
- url: _this.config("APIHOST1") + '/alioss/upload', //真实的接口地址
- file: _this.blobData,
- // file: recordPath,
- name: 'file',
- success: (uploadFileRes) => {
- console.error('uploadFileRes------' + uploadFileRes)
- uni.hideLoading();
- _this.content = JSON.parse(uploadFileRes.data).data;
- // console.log("语音:" + that.content)
- _this.setChatSave();
- uni.hideLoading();
- }
- });
- }, 1000)
- } else {
- _this.$queue.showToast('语音要大于一秒才可以发送!')
- }
- } else {
- console.log('取消发送录音');
- }
- _this.willStop = false;
- },
- config: function(name) {
- var info = null;
- if (name) {
- var name2 = name.split("."); //字符分割
- if (name2.length > 1) {
- info = configdata[name2[0]][name2[1]] || null;
- } else {
- info = configdata[name] || null;
- }
- if (info == null) {
- let web_config = cache.get("web_config");
- if (web_config) {
- if (name2.length > 1) {
- info = web_config[name2[0]][name2[1]] || null;
- } else {
- info = web_config[name] || null;
- }
- }
- }
- }
- return info;
- },
- }
- }
- </script>
- <style lang="scss">
- @import "../setting/css/style.scss";
- page {
- background: #346EF6;
- }
- .datt {
- font-size: 42rpx;
- font-family: PingFang SC;
- font-weight: 800;
- }
- </style>
|