2023.07.20 | admin | 123次围观
开发小程序不可避免的需要获取一些设备权限,例如相机、麦克风、保存到相册等权限,这里介绍一下
流程
获取一个权限,我们先通过wx.getSetting查看当前这个权限的情况,可能会有3种情况,
以麦克风权限scope.record为例:
打开小程序设置界面
想要打开小程序的这个设置页面无法获取摄像头数据 请检查是否已经打开摄像头权限,有2种方法:
这两种方法都需要用户主动点击触发,我们可以写一个button或者modal组件,放在页面中,或者写一个包含按钮的获取权限的页面。
这里我们采取一个投机取巧的方法无法获取摄像头数据 请检查是否已经打开摄像头权限,使用wx.showModal,在它的success中调用wx.openSetting,这样就不需要增加额外的按钮或者弹窗了:
// 打开设置权限的页面 去设置权限 通过showModal去触发点击
export function openSetting(scopeStr) {
return new Promise((resolve, reject) => {
Taro.showModal({
title: '温馨提示',
content: '请授权微信小程序相关权限,以使用更多功能',
confirmColor: primaryColor,
success: (res) => {
if (res.confirm) {
Taro.openSetting({
success: function (res) {
console.log('打开权限设置页面', res)
const authSettingObj = res.authSetting
if (scopeStr) {
// 有指定去获取的权限
if (authSettingObj[scopeStr] === true) {
return resolve(true)
} else {
return reject(false)
}
} else {
// 没有指定去获取的权限
return resolve(true)
}
},
})
} else {
return reject()
}
},
fail: (err) => {
return reject()
},
})
})
}
复制代码
获取权限的完整代码
/**
*
* @param {*} scopeStr // 'scope.record' // 权限列表 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html
* @returns
*/
export function checkPermisson(scopeStr) {
return new Promise((resolve, reject) => {
Taro.getSetting({
success: async (res) => {
const authSettingObj = res.authSetting
if (authSettingObj[scopeStr] === true) {
// 当前已经有权限了
console.log('当前已经有权限了', scopeStr)
return resolve(true)
} else if (authSettingObj[scopeStr] === false) {
// 之前问过权限,但是拒绝了
console.log('之前问过权限,但是拒绝了', scopeStr)
// 打开setting
try {
await openSetting(scopeStr)
return resolve(true)
} catch {
return reject(false)
}
} else {
// 还没问过权限
console.log('还没问过权限', scopeStr)
// 去请求授权
Taro.authorize({
scope: scopeStr,
success: (res) => {
return resolve(true)
},
fail: async (err) => {
// 拒绝授权了
// 打开setting
try {
await openSetting(scopeStr)
return resolve(true)
} catch {
return reject(false)
}
},
})
}
},
})
})
}
复制代码
使用
使用的时候只需要执行一下await checkPermisson(**)就可以了,如果能走到下一行,那就是获取权限成功了。
例:
// 切换到语音输入框
async function handleToggleVoice() {
if (!isShowVoice.value) {
// 先调用这个 请求麦克风权限
await checkPermisson('scope.record')
}
// 拿到了麦克风权限
isShowVoice.value = !isShowVoice.value
}
复制代码
版权声明
本文仅代表作者观点。
本文系作者授权发表,未经许可,不得转载。
发表评论