BarCodeUtil.js 3.74 KB


class BarCodeUtil {
  static barcode = null;

  /**
   * @private
   */
  static hasLight = false;


  /**
   * 停止扫码
   */
  static stopScan() {
    if (this.barcode !== null) {
      this.barcode.close();
    }
  }

  /**
   * 切换闪光灯
   * @return {boolean} 切换后闪光灯是否开启
   */
  static switchLight() {
    if (this.barcode !== null) {
      this.hasLight = !this.hasLight;
      this.barcode.setFlash(this.hasLight);
    }
    return this.hasLight;
  }

  static typeToString(type) {
    const { plus } = window;
    // eslint-disable-next-line guard-for-in
    for (const key in plus.barcode) {
      const value = plus.barcode[key];
      if (type === value) {
        return key;
      }
    }
    return '未知';
  }

  /**
   * 开始扫码
   * @param { (type, code)=>void } successHandler 扫码成功的处理方法
   */
  static startScan(successHandler) {
    this.stopScan();
    let view = null;
    const { plus } = window;
    const height = plus.screen.resolutionHeight - plus.navigator.getStatusbarHeight();
    this.barcode = plus.barcode.create(
      'barcode',
      [
        plus.barcode.QR,
        plus.barcode.EAN13,
        plus.barcode.EAN8,
        plus.barcode.AZTEC,
        plus.barcode.DATAMATRIX,
        plus.barcode.UPCA,
        plus.barcode.UPCE,
        plus.barcode.CODABAR,
        plus.barcode.CODE39,
        plus.barcode.CODE93,
        plus.barcode.CODE128,
        plus.barcode.ITF,
        plus.barcode.MAXICODE,
        plus.barcode.PDF417,
        plus.barcode.RSS14,
        plus.barcode.RSSEXPANDED,
      ],
      {
        top: '0',
        left: '0px',
        width: '100%',
        buttom: '0',
        position: 'absolute',
        zIndex: '1',
      },
    );
    this.barcode.onmarked = (type, result) => {
      this.stopScan();
      newBaseView.close();
      successHandler(type, result);
    };

    view = new plus.nativeObj.View(
      'test',
      {
        top: '20px', left: '20px', height: '30px', width: '80px',
      },
      [
        {
          tag: 'font',
          id: 'font',
          text: '关闭',
          textStyles: { size: '18px', color: '#fff' },
          position: {
            top: '0px',
            left: '0px',
            width: '100%',
            height: '30px',
          },
        },
      ],
    );

    // view.interceptTouchEvent(true);
    // plus.webview.currentWebview().append(view);

    const id = Date.now().toString();
    const newBaseView = plus.webview.create('', id, { top: '0px', bottom: '0px', height });
    newBaseView.append(this.barcode);
    newBaseView.append(view);
    newBaseView.show();
    this.barcode.start();
    view.addEventListener('click', () => {
      newBaseView.close();
      this.barcode.close();
    }, false);
  }

  /* 调用手机摄像头并拍照 */
  static getImage() {
    const { plus } = window;
    const cmr = plus.camera.getCamera();
    cmr.captureImage((p) => {
      plus.io.resolveLocalFileSystemURL(p, (entry) => {
        this.uploadImage(entry.toLocalURL(), entry.name); // 上传拍照的图片
      }, (e) => {
        plus.nativeUI.toast(`读取拍照文件错误:${e.message}`);
      });
    }, (e) => {
      plus.nativeUI.toast(`调用摄像头错误:${e.message}`);
    }, {
      filter: 'image',
    });
  }

  /* 相册选择图片 */
  static getPhoto() {
    const { plus } = window;
    plus.gallery.pick((path) => {
      const name = path.substring(path.lastIndexOf('/') + 1);
      this.uploadImage(path, name);// 上传选择的图片
    }, (e) => {
      plus.nativeUI.toast(`选取图片错误:${e.message}`);
    }, { filter: 'image' });
  }

  /* 图片上传入库 */
  static uploadImage(url, filename) {
    console.log('uploadImage:', url, filename);
  }
}

export default BarCodeUtil;