xinelu-applet-ui/pagesmeeting/calling.vue
2023-11-08 15:33:37 +08:00

285 lines
6.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<view class="trtc-demo-container">
<!-- <view class='title' >
<view>多人会议</view>
</view> -->
<view class="input-box">
<input type="number" v-model="roomID" maxlength="10" placeholder="请输入房间号"
placeholder-style="opacity: 0.55;" />
</view>
<view class="choice-content">
<view class="label">
<text>开启摄像头</text>
<u-switch inactiveColor="#999999" activeColor="#00B38A" v-model="localVideo"
@change="switchHandler" />
</view>
<view class="label">
<text>开启麦克风</text>
<u-switch inactiveColor="#999999" activeColor="#00B38A" v-model="localAudio"
@change="switchHandler2" />
</view>
</view>
</view>
<view class='bottom-btn'>
<button class="btn" @click="enterRoom" hover-class="none">进入房间</button>
</view>
</view>
</template>
<script>
// import {
// genTestUserSig
// } from './debug/GenerateTestUserSig'
import {
mapState
} from 'vuex';
export default {
data() {
return {
roomID: '',
localVideo: true,
localAudio: true,
}
},
computed: {
...mapState(['userInfo'])
},
onLaunch() {
},
onLoad() {
},
methods: {
enterRoom() {
const nowTime = new Date()
if (nowTime - this.tapTime < 1000) {
return
}
if (!this.roomID) {
uni.showToast({
title: '请输入房间号',
icon: 'none',
duration: 2000,
})
return
}
if (/^\d*$/.test(this.roomID) === false) {
uni.showToast({
title: '房间号只能为数字',
icon: 'none',
duration: 2000,
})
return
}
if (this.roomID > 4294967295 || this.roomID < 1) {
uni.showToast({
title: '房间号取值范围为 1~4294967295',
icon: 'none',
duration: 2000,
})
return
}
const userID = '123'; //userID
// const Signature = genTestUserSig(userID)
// const url =
// `./room/room?roomID=${this.roomID}&localVideo=${this.localVideo}&localAudio=${this.localAudio}&userID=${userID}&sdkAppID=${Signature.sdkAppID}&userSig=${Signature.userSig}`
this.tapTime = nowTime
this.checkDeviceAuthorize().then((result) => {
console.log('授权成功', result)
wx.navigateTo({
url
})
})
.catch((error) => {
console.log('没有授权', error)
})
},
checkDeviceAuthorize() {
this.hasOpenDeviceAuthorizeModal = false
return new Promise((resolve, reject) => {
if (!wx.getSetting || !wx.getSetting()) {
// 微信测试版 获取授权API异常目前只能即使没授权也可以通过
resolve()
}
wx.getSetting().then((result) => {
console.log('getSetting', result)
this.authorizeMic = result.authSetting['scope.record']
this.authorizeCamera = result.authSetting['scope.camera']
if (result.authSetting['scope.camera'] && result.authSetting['scope.record']) {
// 授权成功
resolve()
} else {
// 没有授权,弹出授权窗口
// 注意: wx.authorize 只有首次调用会弹框,之后调用只返回结果,如果没有授权需要自行弹框提示处理
console.log('getSetting 没有授权,弹出授权窗口', result)
wx.authorize({
scope: 'scope.record',
}).then((res) => {
console.log('authorize mic', res)
this.authorizeMic = true
if (this.authorizeCamera) {
resolve()
}
})
.catch((error) => {
console.log('authorize mic error', error)
this.authorizeMic = false
})
wx.authorize({
scope: 'scope.camera',
}).then((res) => {
console.log('authorize camera', res)
this.authorizeCamera = true
if (this.authorizeMic) {
resolve()
} else {
this.openConfirm()
reject(new Error('authorize fail'))
}
})
.catch((error) => {
console.log('authorize camera error', error)
this.authorizeCamera = false
this.openConfirm()
reject(new Error('authorize fail'))
})
}
})
})
},
openConfirm() {
if (this.hasOpenDeviceAuthorizeModal) {
return
}
this.hasOpenDeviceAuthorizeModal = true
return uni.showModal({
content: '您没有打开麦克风和摄像头的权限,是否去设置打开?',
confirmText: '确认',
cancelText: '取消',
success: (res) => {
this.hasOpenDeviceAuthorizeModal = false
console.log(res)
// 点击“确认”时打开设置页面
if (res.confirm) {
console.log('用户点击确认')
wx.openSetting({
success: (res) => {},
})
} else {
console.log('用户点击取消')
}
},
})
},
switchHandler(e) {
this.localVideo = e;
},
switchHandler2(e) {
this.localAudio = e;
},
onBack() {
wx.navigateBack({
delta: 1,
})
},
}
}
</script>
<style scoped>
.container {
width: 100vw;
height: 100vh;
background-color: #F5F5F5;
position: fixed;
top: 0;
right: 0;
left: 0;
bottom: 0;
}
.trtc-demo-container {
/* background-image: url(https://mc.qcloudimg.com/static/img/7da57e0050d308e2e1b1e31afbc42929/bg.png); */
/* background-color: #333; */
/* background-repeat:no-repeat;
background-size: cover; */
width: 100vw;
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
}
.trtc-demo-container .title {
color: #FFFFFF;
padding-top: 65rpx;
line-height: 60rpx;
}
.trtc-demo-container .input-box {
background-color: transparent;
color: #333;
padding: 2vw 5vw 1vw;
border-bottom: 1px solid #577785;
margin: 100rpx 0 40rpx 0;
text-align: center;
box-sizing: border-box;
width: 80vw;
}
.trtc-demo-container .input-box input {
font-size: 20px;
}
.choice-content {
margin-top: 20rpx;
width: 80vw;
display: flex;
flex-direction: column;
/* justify-content: space-between;
flex-wrap: wrap; */
font-size: 14px;
color: #333;
}
.label {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 24rpx 0;
}
.choice-content switch {
color: #00B38A;
transform: scale(0.8);
}
.bottom-btn {
position: fixed;
width: 100vw;
text-align: center;
bottom: 5vh;
}
.bottom-btn .btn {
width: 80%;
background-color: #00B38A;
border-radius: 50px;
color: #ffffff;
}
.close {
position: absolute;
padding-left: 5vw;
padding-right: 5vw;
width: 50rpx;
height: 60rpx;
}
</style>