折叠屏扫描二维码方案

极客班主任
• 阅读 70

本示例介绍使用自定义界面扫码能力在折叠屏设备中实现折叠态切换适配。自定义界面扫码使用系统能力customScan,其提供相机流的初始化、启动扫码、识别、停止扫码、释放相机流资源等能力。折叠屏折叠状态通过监听display的foldStatusChange事件实现。

效果图预览

折叠屏扫描二维码方案

使用说明

  1. 用户授权相机扫码。
  2. 对准二维码即可识别展示,支持多二维码识别。
  3. 支持打开相机闪光灯。
  4. 折叠态不同,相机流的尺寸也不同,因此折叠态变更时,扫码服务会重新初始化。

实现思路

  1. 相机权限需要用户授权。
// 向用户申请授权 
let context = getContext() as common.UIAbilityContext; 
let atManager = abilityAccessCtrl.createAtManager(); 
let grantStatusArr = await atManager.requestPermissionsFromUser(context, [ 'ohos.permission.CAMERA' ]); 
const grantStatus = grantStatusArr.authResults[0];
  1. 依赖XComponent展示相机流内容,在加载完相机流后启动相机扫码服务。
// TODO:知识点:相机流显示依赖XComponent 
XComponent({ 
  id: CommonConstants.CAMERA_XCOMPONENT_ID, 
  type: CommonConstants.CAMERA_XCOMPONENT_TYPE, 
  controller: this.cameraSurfaceController 
}) 
  .onLoad(() => { 
    // TODO:知识点:customScan依赖XComponent组件的surfaceId,对图像进行扫描 
    this.customScanVM.surfaceId = this.cameraSurfaceController.getXComponentSurfaceId(); 
    // TODO:知识点:XComponent加载完成后,启动相机进行扫码 
    this.customScanVM.startCustomScan(); 
  })
  1. 二维码识别通过customScan系统能力在启动扫描之后,通过异步任务监控相机图像,对识别到的内容直接返回处理。
try { 
  const viewControl: customScan.ViewControl = { 
    width: this.cameraCompWidth, 
    height: this.cameraCompHeight, 
    surfaceId: this.surfaceId 
  }; 
  customScan.start(viewControl) 
    .then((result: Array<scanBarcode.ScanResult>) => { 
      // 处理扫码结果 
      this.showScanResult(result); 
    }) 
} catch (error) { 
  logger.error('start fail, error: %{public}s ', JSON.stringify(error)); 
}
  1. 识别到的数据为一个结果数组,每一个结果包括识别到的码源信息和二维码图像所在屏幕的坐标。
let showMsg: string = ''; 
// 处理扫码结果 
scanResult.forEach((result: scanBarcode.ScanResult) => { 
  // 码源信息 
  const originalValue: string = result.originalValue; 
  // 二维码在屏幕上的位置 
  const scanCodeRect: scanBarcode.ScanCodeRect | undefined = result.scanCodeRect; 
 
  if (scanCodeRect) { 
    showMsg += `内容: ${originalValue}\n坐标: ${JSON.stringify(scanCodeRect)}\n`; 
  } 
})
  1. 折叠屏设备上,依赖display的屏幕状态事件,监听屏幕折叠状态变更,通过对折叠状态的分析,更新XComponent尺寸并重新启动扫码服务。
display.on('foldStatusChange', async (curFoldStatus: display.FoldStatus) => { 
  // 同一个状态重复触发不做处理 
  if (this.curFoldStatus === curFoldStatus) { 
    return; 
  } 
 
  // 缓存当前折叠状态 
  this.curFoldStatus = curFoldStatus; 
 
  if (this.curFoldStatus === display.FoldStatus.FOLD_STATUS_EXPANDED 
    || this.curFoldStatus === display.FoldStatus.FOLD_STATUS_FOLDED) { 
    // 当前没有相机流资源,只更新相机流宽高设置 
    if (!this.surfaceId) { 
      this.updateCameraCompSize(); 
      return; 
    } 
 
    // 关闭闪光灯 
    this.tryCloseFlashLight(); 
    setTimeout(() => { 
      // 释放扫码资源 
      this.releaseCustomScan(); 
      // 重新启动扫码 
      this.restartCustomScan(); 
    }, 10) 
  } 
})

工程结构&模块类型

customscan                           // har类型 
  |---common 
  |   |---constants 
  |   |    |---CommonConstants.ets     // 通用常量 
  |---components 
  |   |---CustomScanCameraComp.ets     // 自定义组件-二维码扫描相机流组件 
  |   |---CustomScanCtrlComp.ets       // 自定义组件-二维码扫描控制菜单组件 
  |---model 
  |   |---PermissionModel.ets          // 模型层-权限控制管理器 
  |   |---WindowModel.ets              // 模型层-窗口管理器  
  |---pages 
  |   |---CustomScanPage.ets           // 展示层-二维码扫描页面  
  |---viewmodel 
  |   |---CustomScanViewModel.ets      // 控制层-二维码扫描控制器

模块依赖

utils

参考资料

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)
0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We
京东小程序折叠屏适配探索 | 京东云技术团队
京东小程序近年来支持了越来越多的业务和应用,做好小程序的折叠屏的适配也是符合未来的发展趋势,能为用户和业务方提供更好的体验和价值。
_dolphin _dolphin
4年前
.net core Cookie的使用
缘起:  公司领导让我做一个测试的demo,功能大概是这样的:用户通过微信扫一扫登陆网站,如果用户登录过则直接进入主界面,否则就保留在登录界面。实现方法:  首先先把网站地址生成个二维码,在扫描二维码后去获取Cookie如果有值那么就证明登录过直接跳转到主界面,如果Cookie不存在用户通过登录记录的用户信息并保存到Cookie。什么是Cookie:  储存
Wesley13 Wesley13
3年前
Android二维码扫码ZXing,barcodescanner和BGAQRCode
Android二维码扫码ZXing,barcodescanner和BGAQRCodeAndroid技术比较Android二维码扫描是一种常见的功能开发,但是技术选型不当会造成初期开发难度大、后期维护成本高。常见的Android二维码扫码解决方案很多,比如ZXing,barcodescanner和BGAQRCodeAndroid等等。以下给出这
wnm wnm
3年前
万能码那些功能引人注目(安全扫码专业委员会)
万能码那些功能引人注目(安全扫码专业委员会)一码一用的二维码太多了,也很常见,出去买个菜,付钱的时候有商家有收款码;去餐馆吃个饭商家有点餐的二维码,也有最后结账的二维码;和朋友出去玩,手机没有电了,有万能充电宝,只需要扫一扫就可以租一个充电宝充电;在酒店里有直接扫码连接WiFi的二维码;在一些外卖APP里低价买了一张折扣券,优惠券使用核销时的时候也是使用二维
wnm wnm
3年前
万能码,你的启明星(安全扫码专业委员会)
万能码,你的启明星(安全扫码专业委员会)在5G时代,大数据是一种趋势,是一种潮流,更是一种发展方向,各行各业都有许多的数字化改革和建设,而二维码就是其中的佼佼者,自从二维码横空出世,就获得了开始了它发展凶猛的势头,并且越来越烈,到如今已经成为了家家户户必备的用品,例如,加微信好友,扫描二维码;登录电脑,扫码二维码;支付结账,扫描二维码;饭店点餐,扫码二维码等
linbojue linbojue
1年前
极致之上,再进一步《vivo X Fold3 Pro》
2024年,既是属于智能手机的变革之年,也是折叠屏旗舰至关重要的突破之年。生成式AI对智能手机的冲击固然巨大,但对于折叠屏旗舰而言,则有着另一条同样重要的「暗线」,就是如何在折叠屏自身的硬件限制之下进一步突破,来挑战高端直板手机。如今的折叠屏手机相比普通直
陈杨 陈杨
1个月前
鸿蒙5开发宝藏案例分享---折叠屏悬停态开发实践
🌟【鸿蒙折叠屏开发宝藏指南】原来官方藏了这么多好东西!手把手教你玩转悬停态开发🌟Hey小伙伴们!我是你们的老朋友XX,最近在肝鸿蒙折叠屏项目时,意外挖到了官方文档里的隐藏宝藏!原来HarmonyOS早就准备好了超多实用案例,今天必须带大家解锁"悬停态"
陈杨 陈杨
1个月前
鸿蒙5开发宝藏案例分享---三折叠应用开发分享
鸿蒙三折叠应用开发宝藏分享:官方案例详解与实战代码大家好呀!今天在翻鸿蒙文档时发现一个​​超级宝藏​​——官方提供的三折叠开发案例!之前总觉得多设备适配复杂,没想到HarmonyOS早就准备好了完善方案。话不多说,直接上干货,结合代码带大家玩转三折叠屏开发
GeorgeGcs GeorgeGcs
1个月前
【HarmonyOS NEXT】鸿蒙使用ScanKit实现自定义扫码 (一)之业务流程和扫码
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言鸿蒙官方提供了ScanKit来实现自定义扫码的功能诉求。但是对于扫码业务的讲解缺失,所以这篇文章主要是通过扫码业务路程,串连官方Kit的接口。让大家能更深刻的理解自定义扫码业务。官