【HarmonyOS NEXT】使用扫码功能customScan.start时,跳转二级页面,应用前后台后,返回后界面都变成全黑

【关键字】

扫码 / customScan / 跳转二级页面 / 黑屏

【问题描述】

使用扫码功能customScan.start时,跳转二级页面,应用前后台后,返回后界面都变成全黑。在onPageShow和onPageHide里去分别调用start和stop,发现这样是不行的。必须是start和release。这个设计也很奇怪,既然必须release的才能start那你这个stop设计的是有什么用呢?

demo代码如下:

import { display } from '@kit.ArkUI';
import { tag } from '@kit.ConnectivityKit';
import { customScan, scanBarcode, scanCore } from '@kit.ScanKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl } from '@kit.AbilityKit';

@Entry
@Component
export struct BarcodeDemo{

  private mXComponentController: XComponentController = new XComponentController();
  private viewControl: customScan.ViewControl | null = null;
  @State showScan: boolean = false;

  aboutToAppear(): void {
    //相机权限申请
    let atManager = abilityAccessCtrl.createAtManager();
    try {
      atManager.requestPermissionsFromUser(getContext(this), ["ohos.permission.CAMERA"]).then((data) => {
        data.permissions.forEach((permission: string, index: number) => {
          if (permission === "ohos.permission.CAMERA") {
            if (data.authResults[index] === 0) {
              //说明相机权限申请成功
              this.showScan = true;
            }
          }
        })
      }).catch((err: Error) => {
        console.info("data:" + JSON.stringify(err));
      })
    } catch (err) {
      console.error(`catch err->${JSON.stringify(err)}`);
    }
  }

  build() {
    Column(){
      if (this.showScan) {
        XComponent({
          id: 'componentId',
          type: 'surface',
          controller: this.mXComponentController
        })
          .onLoad(() => {
            // 获取XComponent的surfaceId
            let surfaceId: string = this.mXComponentController.getXComponentSurfaceId();
            // 设置ViewControl相应字段
            this.viewControl = {
              width: display.getDefaultDisplaySync().width,
              height: display.getDefaultDisplaySync().height,
              surfaceId: surfaceId
            };
            //init
            let options: scanBarcode.ScanOptions = {
              scanTypes: [scanCore.ScanType.TWO_D_CODE],
              enableMultiMode: false,
              enableAlbum: false
            }
            try {
              customScan.init(options);
            } catch (error) {
              console.error('Failed to init, error: %{public}s', JSON.stringify(error))
            }
            //start
            try {
              customScan.start(this.viewControl, (error: BusinessError, scanResult: Array<scanBarcode.ScanResult>) => {
                if (error) {
                  return;
                }
              });
            } catch (error) {
            }
          })// 预览流宽、高,默认单位vp,支持px、lpx、vp
          .height('100%')
          .width('100%')
      }
    }
  }
}

【解决方案】

参考官方样例代码:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/scan-customscan-0000001724022421#section2061992014108

跳转二级页面,应用前后台后是需要使用init和release初始化/释放相机的。stop主要是用于暂停相机流,考虑到可能有其他开发者有暂停相机流的需求,所以开放了这个接口。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值