uni-app上架应用添加权限提示框

例如:录音需要添加权限提示

点击录音提示弹框

javascript 复制代码
        <van-popup v-model="isShowAudio" style="border-radius: 10px;">
            <div style="background: #fff;padding: 16px 20px;width: 70vw;border-radius: 10px;">
                <div style="font-weight: 600;padding-bottom: 10px;">麦克风权限说明</div>
                <div style="font-size: 14px;line-height: 20px;">为方便您通过语音描述问题提交随手拍工单,需获取麦克风权限。仅在您明示同意后启用,全程保护您的语音信息安全。
                </div>
                <div style="text-align: right;font-size: 14px;color: #00adff;padding-top: 16px;">
                    <span @click="isShowAudioChange" style="display: inline-block;padding-right: 16px;">确定</span>
                    <span @click="isShowAudio = false">取消</span>
                </div>
            </div>
        </van-popup>

        async isShowAudioChange() {
// web-view 通行记录是否已经弹出
            webViewJs.postMessage({
                data: {
                    action: 'isShowAudio'
                }
            });
            this.isShowAudio = false
            this.$wxApi.initVoice().then(async res => {
                if (res === 'sq') {
                    await this.$wxApi.initVoice2()
                } else if (res === 'success') {
                    this.startRecord()
                } else {

                }
            })
        },

 async startRecordChange() {
            if (isPlusEnv()) {
//是否有授权音频
                if (this.$wxApi.r) {
                    this.startRecord()
                } else {
                    // await this.$wxApi.initVoicePhoto()
                    // plus.storage.setItem('baseURL', baseURL)
                    if (+this.isShowAudioStore === 1) {
                        this.startRecord()
                    } else {
                        await this.$wxApi.initVoice2()
                        this.isShowAudio = true
                    }
                }
                return
            }
            this.startRecord()
        },

async startRecord() {
            if (this.readonly) return
            const _this = this
            try {
                _this.$wxApi.audioRecord(async function (obj, res) {
                    // obj 音频的信息, res服务上传接口返回的信息
                    _this.handleChange({
                        duration: obj.duration,
                        accessUrl: res.data.data.accessUrl
                    })
                }).catch(() => {
                    throw new Error('error')
                    })
            } catch (error) {
            }
        },


export let r = null
// 授权提示
export function initVoice2() {
    r = plus.audio.getRecorder()
    r.record({ filename: '_doc/audio/' }, function(p) {}, function(e) {})
            // setTimeout(() => {
            //     r && r.stop()
            // }, 30)
}

export function audioRecord(cb) {
    if (isPlusEnv()) {
        return plusAudioRecord(cb)
    } else {
        return wxAudioRecord(cb)
    }
}
function plusAudioRecord(cb) {
    plusStartRecord()
    plusStop()
    return new Promise((resolve, reject) => {
        r.record(
            { filename: '_doc/audio/' },
            function (p) {
                console.log('录音完成:' + p)
                plus.io.resolveLocalFileSystemURL(
                    p,
                    function (entry) {
                        recordUpload(
                            {
                                path: entry.name,
                                duration
                            },
                            function (fileInfo, uploadRes) {
                                cb && cb(fileInfo, uploadRes)
                                resolve(fileInfo)
                            },
                            reject()
                        )
                    },
                    function (e) {
                        reject('读取录音文件错误:' + e.message)
                    }
                )
            },
            function (e) {
                console.log(e);
                if (e.message === 'No Permission') {
                    Vue.toast('为了帮您录制清晰的语音,需要您在设置中允许 [麦克风] 权限')
                    stopRecord()
                }
                reject(e)
            }
        )
    })
}
相关推荐
程序员爱钓鱼6 分钟前
Rust Associated Type关联类型详解:为Trait定义内部类型
前端·后端·rust
zh_xuan1 小时前
个人主页左侧菜单支持分组,以及菜单显示和隐藏
前端·javascript·css
Ming_studying1 小时前
HTML + CSS + JavaScript实现可视化JSON工具:格式化、折叠、搜索与错误定位
javascript·css·html·json·数据可视化·web工具
Emily156853598704 小时前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
To_OC9 小时前
面试被问了三回三栏布局,这次我终于把 BFC 那层窗户纸捅破了
前端·css·面试
To_OC9 小时前
啃完 TS 工具类型我发现:Pick 和 Omit 原来就是一层窗户纸
前端·面试·typescript
风月说与山鬼11 小时前
三、大括号语法
前端·react.js
kyriewen11 小时前
我把最常踩的8个CORS跨域报错整理了一遍——第8个去年还不存在
前端·javascript
Csvn12 小时前
🕰️ 闭包 + setTimeout 的 5 个经典陷阱:为什么定时器看到的永远不是最新的值?
前端