二话不说,上代码:
/**
* 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模式。
报错的状态码中,有权限问题的,有其他问题的。
如果是权限问题,用户可能会解决。
下次进来继续检测,或者进入新页面的时候检测。
比如:
首页判断一次版本,从跳转到需要视觉能力的页面时,请求权限,如果没有相机权限,提示用户开启权限才能进入该页面。在该页面重新获取一次版本号。