一:介绍
最近在使用uniapp做一个视频录制的功能,需要获取麦克风权限和相机权限,本人是第一次写uniapp开发,所以在获取权限这边踩了一些坑,比如“”需要哪些调用api和如何合理引导用户设置权限等问题。
二:uni.getSetting()、uni.authorize()、uni.openSetting()
1、这里用到的api有uni.getSetting()、uni.authorize()、可以放在mounted里面,用户首次进入有需要的页面时,可以利用这两个api判断是否拥有此权限和唤起设置权限的弹窗。
uni.getSetting({
success: async function(res) {
that.hasMicPermission = res.authSetting['scope.record'];
that.hasCameraPermission = res.authSetting['scope.camera'];
if (!that.hasMicPermission) {
uni.authorize({
scope: "scope.record",
success(res) {
that.hasMicPermission = true;
console.log("同意麦克风授权");
},
fail(err) {
console.log("拒绝麦克风授权");
}
})
}
if (!that.hasCameraPermission) {
uni.authorize({
scope: "scope.camera",
success(res) {
that.hasCameraPermission = true;
console.log("同意相机授权");
},
fail() {
console.log("拒绝相机授权");
}
})
}
}
});
2、问题来了,假如用户不小心点了拒绝,下次再进来是无法唤醒设置权限弹窗的。所以下面我们还需要利用一个api:uni.openSetting()。这个api可以打开权限的设置,让用户自己去重新设置权限。比如当用点击某个按钮后,判断是否有权限,没有则手动去引导用户开启权限。
// 手动调用权限
handleRequestPermission(){
const that = this;
uni.showModal({
title: '提示',
content: '缺少相关权限,是否前往开启?',
success(res) {
if (res.confirm) {
// 点击确定按钮,尝试拉起权限
uni.openSetting({
success(res) {
//相机
if (res.authSetting['scope.camera']) {
that.hasCameraPermission = true;
} else {
uni.showToast({
title: "摄像头权限未开启",
icon: "none",
duration:2000
});
}
//麦克风
if (res.authSetting['scope.record']) {
that.hasMicPermission = true;
} else {
console.log('拒绝麦克风权限');
uni.showToast({
title: "麦克风权限未开启",
icon: "none",
duration:2000
});
}
},
fail(err) {
uni.navigateBack()
}
});
}
},
});
},
三:完整代码
<template>
<div>
<button @click="handleRequestPermission">拉取权限</button>
</div>
</template>
<script>
export default {
data() {
return {
hasMicPermission: false, //录音权限
hasCameraPermission: false, //摄像头权限
}
},
methods: {
checkPermission() {
const that = this;
// 检查相机麦克风权限
// #ifdef MP
uni.getSetting({
success: async function (res) {
that.hasMicPermission = res.authSetting['scope.record'];
that.hasCameraPermission = res.authSetting['scope.camera'];
if (!that.hasMicPermission) {
uni.authorize({
scope: "scope.record",
success(res) {
that.hasMicPermission = true;
console.log("同意麦克风授权");
},
fail(err) {
console.log("拒绝麦克风授权");
}
})
}
if (!that.hasCameraPermission) {
uni.authorize({
scope: "scope.camera",
success(res) {
that.hasCameraPermission = true;
console.log("同意相机授权");
},
fail() {
console.log("拒绝相机授权");
}
})
}
}
});
// #endif
},
// 操作时候,判断是否有相关权限
handleRequestPermission() {
if (this.hasMicPermission && this.hasCameraPermission) return;
const that = this;
uni.showModal({
title: '提示',
content: '缺少相关权限,是否前往开启?',
success(res) {
if (res.confirm) {
// 点击确定按钮,尝试拉起权限
uni.openSetting({
success(res) {
console.log(res)
//相机
if (res.authSetting['scope.camera']) {
that.hasCameraPermission = true;
} else {
uni.showToast({
title: "摄像头权限未开启",
icon: "none"
});
}
//麦克风
if (res.authSetting['scope.record']) {
that.hasMicPermission = true;
} else {
uni.showToast({
title: "麦克风权限未开启",
icon: "none"
});
}
},
fail(err) {
uni.navigateBack()
}
});
}
},
});
},
},
mounted() {
// 检查权限
this.checkPermission();
}
}
</script>