解决微信小程序因切换摄像头权限引起的camera组件区域渲染异常问题

90 阅读1分钟

【问题描述】若在微信小程序页面中使用camera组件不加控制,会出现用户在该页面主动去修改小程序设置中“摄像头”权限页面无法更新组件渲染状态的情况;

【已知条件】camera组件使用限制如下:

  • 同一页面只能插入一个 camera 组件;
  • 设置中显示的权限项,仅包含当前小程序“已使用过”的 scope。(如果页面 从未渲染 <camera> 组件,也 从未调用 wx.chooseMediawx.createCameraContext 等相机相关 API, 那么微信认为“不需要相机权限”,就不会在设置页展示该选项。)
  • <camera> 组件在权限缺失时会渲染失败(白屏或不显示),且不会因权限后续变化而自动恢复

【解决思路】利用onShowonHide生命周期,加上v-if去创删组件

<camera
  v-if="!hideCamera"
  device-position="back"
  flash="off"
></camera>

// hideCamera初始声明为false
// ...
onShow() {
    // 关键:先创建一次上下文,触发权限注册
    try {
      wx.createCameraContext(); // 不报错,但会向微信声明“要用相机”
    } catch (e) {
      console.log("createCameraContext 调用(用于触发权限声明)");
    }
    
    this.hideCamera = false;
    // ... wx.getSetting查询已有权限
},
onHide() {
    this.hideCamera = true;
},