xinelu-applet-ui/pagesmeeting/calling.vue

285 lines
6.5 KiB
Vue
Raw Normal View History

2023-11-08 14:09:33 +08:00
<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>
2023-11-08 15:33:37 +08:00
// import {
// genTestUserSig
// } from './debug/GenerateTestUserSig'
2023-11-08 14:09:33 +08:00
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
2023-11-08 15:33:37 +08:00
// 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}`
2023-11-08 14:09:33 +08:00
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;
}
2023-11-08 15:33:37 +08:00
</style>