123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <template>
- <view>
- <page-head :title="title"></page-head>
- <view class="uni-padding-wrap">
- <block v-if="!recording && !playing && !hasRecord">
- <view class="page-body-time">
- <text class="time-big">{{formatedRecordTime}}</text>
- </view>
- <view class="page-body-buttons">
- <view class="page-body-button"></view>
- <view class="page-body-button" @click="startRecord">
- <image src="../../../static/record.png"></image>
- </view>
- <view class="page-body-button"></view>
- </view>
- </block>
- <block v-if="recording === true">
- <view class="page-body-time">
- <text class="time-big">{{formatedRecordTime}}</text>
- </view>
- <view class="page-body-buttons">
- <view class="page-body-button"></view>
- <view class="page-body-button" @click="stopRecord">
- <view class="button-stop-record"></view>
- </view>
- <view class="page-body-button"></view>
- </view>
- </block>
- <block v-if="hasRecord === true && playing === false">
- <view class="page-body-time">
- <text class="time-big">{{formatedPlayTime}}</text>
- <text class="time-small">{{formatedRecordTime}}</text>
- </view>
- <view class="page-body-buttons">
- <view class="page-body-button" @click="playVoice">
- <image src="../../../static/play.png"></image>
- </view>
- <view class="page-body-button" @click="clear">
- <image src="../../../static/trash.png"></image>
- </view>
- </view>
- </block>
- <block v-if="hasRecord === true && playing === true">
- <view class="page-body-time">
- <text class="time-big">{{formatedPlayTime}}</text>
- <text class="time-small">{{formatedRecordTime}}</text>
- </view>
- <view class="page-body-buttons">
- <view class="page-body-button" @click="stopVoice">
- <image src="../../../static/stop.png"></image>
- </view>
- <view class="page-body-button" @click="clear">
- <image src="../../../static/trash.png"></image>
- </view>
- </view>
- </block>
- </view>
- </view>
- </template>
- <script>
- // #ifdef APP-PLUS
- import permision from "@/common/permission.js"
- // #endif
- import * as util from '../../../common/util.js'
- var playTimeInterval = null;
- var recordTimeInterval = null;
- var recorderManager = null;
- var music = null;
- export default {
- data() {
- return {
- title: 'start/stopRecord、play/stopVoice',
- recording: false, //录音中
- playing: false, //播放中
- hasRecord: false, //是否有了一个
- tempFilePath: '',
- recordTime: 0,
- playTime: 0,
- formatedRecordTime: '00:00:00', //录音的总时间
- formatedPlayTime: '00:00:00' //播放录音的当前时间
- }
- },
- onUnload: function() {
- this.end();
- },
- onLoad: function() {
- music = uni.createInnerAudioContext();
- music.onEnded(() => {
- clearInterval(playTimeInterval)
- var playTime = 0
- console.log('play voice finished')
- this.playing = false;
- this.formatedPlayTime = util.formatTime(playTime);
- this.playTime = playTime;
- });
- recorderManager = uni.getRecorderManager();
- recorderManager.onStart(() => {
- console.log('recorder start');
- this.recording = true;
- recordTimeInterval = setInterval(() => {
- this.recordTime += 1;
- this.formatedRecordTime = util.formatTime(this.recordTime);
- }, 1000)
- });
- recorderManager.onStop((res) => {
- console.log('on stop');
- music.src = res.tempFilePath;
- this.hasRecord = true;
- this.recording = false;
- });
- recorderManager.onError(() => {
- console.log('recorder onError');
- });
- },
- methods: {
- async startRecord() { //开始录音
- // #ifdef APP-PLUS
- let status = await this.checkPermission();
- if (status !== 1) {
- return;
- }
- // #endif
- // TODO ios 在没有请求过权限之前无法得知是否有相关权限,这种状态下需要直接调用录音,但没有状态或回调判断用户拒绝
- recorderManager.start({
- format: 'mp3'
- });
- },
- stopRecord() { //停止录音
- recorderManager.stop();
- clearInterval(recordTimeInterval);
- },
- playVoice() {
- console.log('play voice');
- this.playing = true;
- playTimeInterval = setInterval(() => {
- this.playTime += 1;
- this.formatedPlayTime = util.formatTime(this.playTime);
- }, 1000)
- music.play();
- },
- stopVoice() {
- clearInterval(playTimeInterval)
- this.playing = false;
- this.formatedPlayTime = util.formatTime(0);
- this.playTime = 0;
- music.stop();
- },
- end() {
- music.stop();
- recorderManager.stop();
- clearInterval(recordTimeInterval)
- clearInterval(playTimeInterval);
- this.recording = false, this.playing = false, this.hasRecord = false;
- this.playTime = 0, this.recordTime = 0;
- this.formatedRecordTime = "00:00:00", this.formatedRecordTime = "00:00:00";
- },
- clear() {
- this.end();
- }
- // #ifdef APP-PLUS
- ,
- async checkPermission() {
- let status = permision.isIOS ? await permision.requestIOS('record') :
- await permision.requestAndroid('android.permission.RECORD_AUDIO');
- if (status === null || status === 1) {
- status = 1;
- } else if (status === 2) {
- uni.showModal({
- content: "系统麦克风已关闭",
- confirmText: "确定",
- showCancel: false,
- success: function(res) {
- }
- })
- } else {
- uni.showModal({
- content: "需要麦克风权限",
- confirmText: "设置",
- success: function(res) {
- if (res.confirm) {
- permision.gotoAppSetting();
- }
- }
- })
- }
- return status;
- }
- // #endif
- }
- }
- </script>
- <style>
- image {
- width: 150rpx;
- height: 150rpx;
- }
- .page-body-wrapper {
- justify-content: space-between;
- flex-grow: 1;
- margin-bottom: 300rpx;
- }
- .page-body-time {
- display: flex;
- flex-direction: column;
- align-items: center;
- }
- .time-big {
- font-size: 60rpx;
- margin: 20rpx;
- }
- .time-small {
- font-size: 30rpx;
- }
- .page-body-buttons {
- margin-top: 60rpx;
- display: flex;
- justify-content: space-around;
- }
- .page-body-button {
- width: 250rpx;
- text-align: center;
- }
- .button-stop-record {
- width: 110rpx;
- height: 110rpx;
- border: 20rpx solid #fff;
- background-color: #f55c23;
- border-radius: 130rpx;
- margin: 0 auto;
- }
- </style>
|