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)
            }
        )
    })
}
相关推荐
GISer_Jing43 分钟前
WebGL跨端兼容实战:移动端适配全攻略
前端·aigc·webgl
迦南giser1 小时前
前端性能——传输优化
前端
小白_ysf1 小时前
Vue 中常见的加密方法(对称、非对称、杂凑算法)
前端·vue.js·算法
2501_944448002 小时前
Flutter for OpenHarmony衣橱管家App实战:支持我们功能实现
android·javascript·flutter
人工智能训练7 小时前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
会跑的葫芦怪8 小时前
若依Vue 项目多子路径配置
前端·javascript·vue.js
xiaoqi9229 小时前
React Native鸿蒙跨平台如何进行狗狗领养中心,实现基于唯一标识的事件透传方式是移动端列表开发的通用规范
javascript·react native·react.js·ecmascript·harmonyos
jin1233229 小时前
React Native鸿蒙跨平台剧本杀组队消息与快捷入口组件,包含消息列表展示、快捷入口管理、快捷操作触发和消息详情预览四大核心功能
javascript·react native·react.js·ecmascript·harmonyos
烬头882111 小时前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
pas13611 小时前
40-mini-vue 实现三种联合类型
前端·javascript·vue.js