微信小程序获取权限(相机、麦克风等权限)

5,480 阅读2分钟

开发小程序不可避免的需要获取一些设备权限,例如相机、麦克风、保存到相册等权限,这里介绍一下

流程

微信小程序获取权限流程.png

获取一个权限,我们先通过wx.getSetting查看当前这个权限的情况,可能会有3种情况
以麦克风权限scope.record为例:

  • 1、res.authSetting['scope.record']===true,之前询问过这个权限,并且用户已经同意了,说明已经有这个权限了
  • 2、res.authSetting['scope.record']===false,之前询问过这个权限,但是用户拒绝了,需要跳到小程序的设置界面(openSetting)
  • 2、res.authSetting['scope.record']不存在,还没有询问过这个权限,我们需要用wx.authorize这个api询问用户获取权限

打开小程序设置界面

min.png

想要打开小程序的这个设置页面,有2种方法:

  • <button open-type='openSetting'>,放一个button,设置open-type
  • wx.openSetting,用代码打开,但是这个方法也必须是通过点击触发

这两种方法都需要用户主动点击触发,我们可以写一个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
  }