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)
            }
        )
    })
}
相关推荐
用户987409238874 分钟前
用 Remotion + edge-tts 打造中文教学视频全自动流水线
前端
风骏时光牛马4 分钟前
Less前端工程化实战:变量混合器与项目样式分层落地
前端
假如让我当三天老蒯8 分钟前
Options API(选项式 API) 和 Composition API(组合式 API)
前端·vue.js·面试
SameX9 分钟前
iOS 独立开发实践:用 MapKit + 像素渲染实现 Citywalk 轨迹地图 App「雁过留痕」
前端
_柳青杨10 分钟前
一文吃透 Node.js 事件循环:从原理到 Node 20+ 重大变更
javascript·后端
skyey26 分钟前
页面加载时,深色模式闪白的问题解决
前端
IT_陈寒36 分钟前
Java 并行流把我坑惨了,这6小时加班值了
前端·人工智能·后端
anOnion10 小时前
构建无障碍组件之Menu Button pattern
前端·html·交互设计
用户479492835691510 小时前
claude Fable用不了?把Gpt 5.5pro接到你的claude code里
前端·后端
JieE21211 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法