0

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

    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
      }
    复制代码

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论