目录

初次授权后相机不显示图像

问题现象

初次授权后相机不显示图像,重启应用后生效。

背景知识

问题定位

  1. 在HiLog日志中搜索XComponent发现应用通过native初始化了相机的预览画面。
    21:46:12.532   10809-10809   C03931/com.exa...AceXcomponent  com.example.hm  I     [(100000:100000:scope)] XComponent[previewWindow] native OnSurfaceCreated
  2. 根据日志时间发现XComponent初始化时机早于授权弹窗。
    21:46:12.764   11213-11213   A05612/commonUI/ASP             com.huawe...commonUI  I     [SPC][PermissionDialog][ViewModel]: group: CAMERA, title: 允许“demo”访问你的相机?, reason: 拍照.

分析结论

由于XComponent加载native实现的时机早于系统授权弹窗,导致相机初始化未完成,导致预览画面无法显示。

修改建议

在初次授权时,重新调用相机的初始化流程。可以通过授权返回结果中dialogShownResults的值是否为true,判断当前是否是初次授权弹窗状态。

getPermission(permissions: Permissions[]): Promise<boolean> {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  let context: Context = this.uiContext.getHostContext() as common.UIAbilityContext;
  return new Promise((resolve) => {
    atManager.requestPermissionsFromUser(context, permissions,
      (err: BusinessError, data: PermissionRequestResult) => {
        if (err) {
          console.log(`previewstreamsdemotest requestPermissionsFromUser fail, err->${JSON.stringify(err)}`);
          return resolve(false);
        } else {
          console.info('PermissionRequestResult data:' + JSON.stringify(data));
          if (data.authResults[0] != 0) {
            return resolve(false);
          }

          // 第一次授权时候切换通道
          if (data.dialogShownResults !== undefined &&
            data.dialogShownResults[0] === true &&
            data.authResults[0] === 0) {
            console.info('previewstreamsdemotest 已切换摄像头通道');
            this.PreviewCamera.switchChannel();
            this.channelId = this.PreviewCamera.GETCHANNELID();
            this.channelWidth = this.PreviewCamera.GETCHANNELWIDTH();
            this.channelHeight = this.PreviewCamera.GETCHANNELHEIGHT();
          }
          return resolve(true);
        }
      });
  });
}

完整代码示例如下: