微信小程序VisionKit视觉能力版本判断

254 阅读2分钟

二话不说,上代码:

/**
 * VisionKit 视觉能力状态码
 * @param {number} state 状态码
 * @param {boolean} user 用户可操作的项
 * @param {string} msg 状态信息
 */
export const VK_STATE = [
  {
    "state": 0,
    "user": false,
    "msg": "成功"
  },
  {
    "state": 104,
    "user": true,
    "msg": "用户取消授权"
  },
  {
    "state": 112,
    "user": false,
    "msg": "接口未在隐私协议中声明"
  },
  {
    "state": 1025,
    "user": false,
    "msg": "小程序隐私接口被封禁,解决方案参考链接"
  },
  {
    "state": 1026,
    "user": false,
    "msg": "小游戏隐私接口被封禁,解决方案参考链接"
  },
  {
    "state": 2000001,
    "user": false,
    "msg": "参数错误"
  },
  {
    "state": 2003000,
    "user": false,
    "msg": "会话不可用"
  },
  {
    "state": 2000000,
    "user": false,
    "msg": "系统错误"
  },
  {
    "state": 2000002,
    "user": false,
    "msg": "设备不支持"
  },
  {
    "state": 2000003,
    "user": false,
    "msg": "系统不支持"
  },
  {
    "state": 2000004,
    "user": false,
    "msg": "设备不支持"
  },
  {
    "state": 2003001,
    "user": true,
    "msg": "未开启系统相机权限"
  },
  {
    "state": 2003002,
    "user": true,
    "msg": "未开启小程序相机权限"
  }
]
/**
 * 检测当前设备VisionKit 支持版本
 * 如果不是用户可操作的状态,直接取上一次的值
 * v1 / v2 是硬件问题,不需要重复检测
 */
export const checkVKVsion = async () => {
  return new Promise(reslove => {
    const v1 = wx.getStorageSync('vk_version1_err')
    const v2 = wx.getStorageSync('vk_version2_err')
    if (v1 && !VK_STATE.find(el => el.state === v1)?.user) {
      reslove(null)
    } else if (v2 && !VK_STATE.find(el => el.state === v2)?.user) {
      reslove('v1')
    } else {
      const session_v2 = wx.createVKSession({
        track: {
          plane: {
            mode: 1
          },
        },
        version: 'v2'
      })
      const session_v1 = wx.createVKSession({
        track: {
          plane: {
            mode: 3
          },
        },
        version: 'v1',
      })
      session_v2.start((err2) => {
        if (err2) {
          wx.setStorageSync('vk_version2_err', err2)
          session_v1.start(err1 => {
            if (err1) {
              wx.setStorageSync('vk_version1_err', err1)
              reslove(null)
            } else {
              reslove('v1')
            }
            session_v1.destroy()
          })
        } else {
          reslove('v2')
        }
        session_v2.destroy()
      })
    }
  })
}

使用也很简单:

//...
async onLoad() {
    if (!wx.getStorageSync('vk_version')) {
      const version = await checkVKVsion()
      wx.setStorageSync('vk_version', version)
    }
    //...
}
//...

简单的说,就是调用v2模式,如果报错,继续调用v1模式。

报错的状态码中,有权限问题的,有其他问题的。

如果是权限问题,用户可能会解决。

下次进来继续检测,或者进入新页面的时候检测。

比如:

首页判断一次版本,从跳转到需要视觉能力的页面时,请求权限,如果没有相机权限,提示用户开启权限才能进入该页面。在该页面重新获取一次版本号。