当前位置: 首页 > news >正文

身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包

项目需求,用ArkTS新一代开发语言实现了在Harmony鸿蒙系统上面兼容身份证阅读器和社保卡读卡器,调用了DonseeDeviceLib.har这个读卡库。

需要注意的是,鸿蒙系统的app扩展名为.hap,本项目编译输出的应用为:entry-default-signed.hap

下面是调用身份证阅读器读取身份证信息的接口,支持居民身份证、GAT居民居住证以及外国人永久居留身份证三种证件读取。

ArkTS语言,CSDN这里没有这个选项,选择的TypeScript。

import CommonContants from '../common/CommonContants';
import DonseeDevice from '@ohos/DonseeDevice/src/main/ets/model/DonseeDevice';
import { IDCardInfor } from '@ohos/DonseeDevice/src/main/ets/model/IDCardInfor';
/*** 广东东信智能科技有限公司* EST-100多功能智能卡读写器*/
@Component
export struct IDCardComponent {@State tvResult: string = '';@State imgBase64: string = '';@State imageVisible: Visibility = Visibility.None;@State nType : number =  1;//0,文本信息;1,文本+照片;2,文本+照片+指纹@Provide showSelector: boolean = false // 是否展开下拉菜单@Provide modesData: any = [{id: 1,name: '文本信息'},{id: 2,name: '文本照片'},{id: 3,name: '文本照片指纹'}]@Provide modeId: number = 0 // 当前选中项idbuild() {Column() {Row() {Column() {Image(this.imgBase64).visibility(this.imageVisible).width(51).height(63).objectFit(ImageFit.Contain)Text(this.tvResult).fontSize(10).margin({ top: 2 })}.layoutWeight(1).margin({left:10}).alignItems(HorizontalAlign.Start)Column() {Column() {Row() {Radio({ value: "文本", group: "1234" }).checked(this.nType === 0 ? true : false).height(20).width(20).onClick(() => {this.nType = 0;})Text('文本')}.margin({ left: 10 })Row() {Radio({ value: "文本照片", group: "1234" }).checked(this.nType === 1 ? true : false).height(20).width(20).onClick(() => {this.nType = 1;console.info("Radio  onClick")})Text('文本照片')}.margin({ left: 10 })Row() {Radio({ value: "文本照片指纹", group: "1234" }).checked(this.nType === 2 ? true : false).height(20).width(20).onClick(() => {this.nType = 2;console.info("Radio  onClick")})Text('文本照片指纹')}.margin({ left: 10 })}.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)Button("读身份证").fontSize($r('app.float.submit_button_font_size')).fontWeight(CommonContants.FONT_WEIGHT).height(30).width(120).onClick(() => {let idInfo:IDCardInfor = DonseeDevice.Donsee_ReadIDCard(this.nType)// HexUtil.bytesToHex()// if(obj.result>0){//   console.info("version: " + obj.version)// }// let[result,base64] = this.donseeDevice.Donsee_ReadIDCard()console.info("result: " + idInfo.result)if(idInfo.result==0){// console.info("obj.base64: " + obj.base64)// console.info("imgBase64.length1: " + this.imgBase64.length)// console.log(("中文姓名:"), idInfo.name);// console.log(("英文姓名:"), idInfo.ENfullname);// console.log(("性    别:"), idInfo.sex);// console.log(("民    族:"), idInfo.people);// console.log(("出身日期:"), idInfo.birthday);// console.log(("家庭住址:"), idInfo.address);// console.log(("身份证号:"), idInfo.number);// console.log(("签发单位:"), idInfo.organs);// console.log(("开始有效期限:"), idInfo.signdate);// console.log(("结束有效期限:"), idInfo.validterm);// console.log(("证件类别:"), idInfo.certType);// console.log(("证件版本:"), idInfo.certVersion);// console.log(("通行证号:"), idInfo.passNu);// console.log(("签发数次:"), idInfo.signCount);if(idInfo.ENfullnameOther.length>0){idInfo.ENfullname += idInfo.ENfullnameOther}this.tvResult ="中文姓名:"+ idInfo.name+"   "+"英文姓名:"+ idInfo.ENfullname+"\n"+"性    别:"+ idInfo.sex+"      "+"民    族:"+ idInfo.people+"  "+"出生日期:"+ idInfo.birthday+"\n"+"家庭住址:"+ idInfo.address+"\n"+"身份证号:"+ idInfo.number+"\n"+"签发单位:"+ idInfo.organs+"    "+"国籍代码:"+ idInfo.nationality+"\n"+"有效期限:"+ idInfo.signdate+" - "+ idInfo.validterm+"\n"+"证件类别:"+ idInfo.certType+"    "+"证件版本:"+ idInfo.certVersion+"\n"+"通行证号:"+ idInfo.passNu+"    "+"换证次数:"+ idInfo.changCount+"\n"+"签发数次:"+ idInfo.signCount+"     "+"既往版本:"+ idInfo.oldNumber+"\n"+"指纹:"+ idInfo.figData+"\n"if(idInfo.imgBase64.length>0){this.imgBase64 = 'data:image/png;base64,'+idInfo.imgBase64this.imageVisible = Visibility.Visible}else{this.imageVisible = Visibility.None}}else{this.imgBase64 = ''this.tvResult =    "读取失败:"+ idInfo.result}}).margin({top:10})Button("身份证ID").fontSize($r('app.float.submit_button_font_size')).fontWeight(CommonContants.FONT_WEIGHT).height(30).width(120).onClick(() => {let[result,data] = DonseeDevice.Donsee_ReadIDCardUid()if(result == 0){this.tvResult =  "Uid:"+ data}else{this.tvResult =  "Uid读取失败:"+ result}}).margin({top:10})}.justifyContent(FlexAlign.End).margin({right:10})}.justifyContent(FlexAlign.Start).width(CommonContants.FULL_PARENT)}.justifyContent(FlexAlign.Start).backgroundColor($r('app.color.card_background')).width(CommonContants.FULL_PARENT).height(CommonContants.FULL_PARENT)}// 获取选中项的内容getSelectedText() {const selectedItem = this.modesData.find(item => {console.info('this.modeId==='+this.modeId)console.info('item.id==='+item.id)return item.id == this.modeId})if (selectedItem) {console.info('selectedItem.name==='+selectedItem.name)return selectedItem.name}return ''}}

以下是社保卡读卡器读取社保卡的代码,支持二代社保卡和三代社保卡读卡。

 

ArkTS语言,CSDN这里没有这个选项,选择的TypeScript。

import CommonContants from '../common/CommonContants';
import DonseeDevice from '@ohos/DonseeDevice/src/main/ets/model/DonseeDevice';
import { IDCardInfor } from '@ohos/DonseeDevice/src/main/ets/model/IDCardInfor';
import { SSCardInfor } from '@ohos/DonseeDevice/src/main/ets/model/SSCardInfor';
import util from '@ohos.util';
/*** 广东东信智能科技有限公司* EST-100多功能智能卡读写器*/
@Component
export struct SSCardComponent {@State tvResult: string = '';@State pKkey: string = '01020304050607080102030405060708||';@State slot : number =  0;//卡座private textInputController: TextInputController = new TextInputController();build() {Column() {Row() {Column() {Row() {Text("pkey:").fontSize(18)TextInput({ controller: this.textInputController,text:'01020304050607080102030405060708||' }).type(InputType.Normal).height(32).margin({ left: $r('app.float.text_input_margin_left') }).layoutWeight(CommonContants.TEXTINPUT_LAYOUT_WEIGHT).onChange(value => {this.pKkey = value})}Text(this.tvResult).fontSize(18)Text("").layoutWeight(1)}.layoutWeight(1).margin({left:10}).alignItems(HorizontalAlign.Start)Column() {Column() {Row() {Text('SAM卡座选择:')}.margin({ left: 10 })Row() {Radio({ value: "SCard", group: "3" }).checked(this.slot === 1 ? true : false).height(20).width(20).onClick(() => {this.slot = 1;console.info("Radio  onClick")})Text('SAM1')Radio({ value: "SCard", group: "3" }).checked(this.slot === 2 ? true : false).height(20).width(20).onClick(() => {this.slot = 2;console.info("Radio  onClick")}).margin({ left: 10 })Text('SAM2')}.margin({ left: 10 })Row() {Radio({ value: "SCard", group: "3" }).checked(this.slot === 3 ? true : false).height(20).width(20).onClick(() => {this.slot = 3;console.info("Radio  onClick")})Text('SAM3')Radio({ value: "SCard", group: "3" }).checked(this.slot === 4 ? true : false).height(20).width(20).onClick(() => {this.slot = 4;console.info("Radio  onClick")}).margin({ left: 10 })Text('SAM4')}.margin({ left: 10 })Row() {Radio({ value: "SCard", group: "3" }).checked(this.slot === 0 ? true : false).height(20).width(20).onClick(() => {this.slot = 0;console.info("Radio  onClick")}).margin({ left: 15 })Text('无').margin({ left: 10 })}}.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)Row() {Button("读取社保卡").fontSize($r('app.float.submit_button_font_size')).fontWeight(CommonContants.FONT_WEIGHT).height(20).width(95).onClick(() => {//nType 1,	有SAM卡返回全部信息   2,	无SAM卡返回卡号var nType = 1if (this.slot == 0) {nType = 2}console.info("nType = " + nType)console.info("this.slot = " + this.slot)let ssCardInfor: SSCardInfor = DonseeDevice.Donsee_ReadSSCardPre(this.slot, nType)console.info("ssCardInfor.result = " + ssCardInfor.result)if (ssCardInfor.result == 0) {// const str = new util.TextDecoder('gbk').decode(ssCardInfor.name)// let gbkDecoder = new util.TextDecoder("gbk",{ignoreBOM: true});console.info("ssCardInfor.name = " + ssCardInfor.nation)console.info("ssCardInfor.name = " + ssCardInfor.name)// this.tvResult =    "姓    名:"+ ssCardInfor.namethis.tvResult = "姓    名:" + ssCardInfor.name + "\n"+ "性    别:" + ssCardInfor.sex + "\n"+ "民    族:" + ssCardInfor.nation + "\n"+ "出身日期:" + ssCardInfor.birthday + "\n"+ "城市代码:" + ssCardInfor.city + "\n"+ "身份证号:" + ssCardInfor.idnumber + "\n"+ "社保卡号:" + ssCardInfor.cardnumber + "\n"+ "开始有效期限:" + ssCardInfor.signdate + "\n"+ "结束有效期限:" + ssCardInfor.validterm + "\n"+ "社保版本:" + ssCardInfor.cardveVrsion + "\n"} else {this.tvResult = "读卡失败:" + ssCardInfor.result}})Button("读基本信息").fontSize($r('app.float.submit_button_font_size')).fontWeight(CommonContants.FONT_WEIGHT).height(20).width(95).onClick(() => {let [result, data] = DonseeDevice.Donsee_iReadCardBas(3)if (result == 0) {this.tvResult = "读基本信息成功:" + data} else {this.tvResult = "读基本信息失败:" + result}})}.margin({ top: 10 })Row() {Button("加密步骤1").fontSize($r('app.float.submit_button_font_size')).fontWeight(CommonContants.FONT_WEIGHT).height(20).width(95).onClick(() => {let [result, data] = DonseeDevice.Donsee_iReadCardBas_HSM_Step1(3)if (result == 0) {this.tvResult = "读卡成功:" + data} else {this.tvResult = "读卡失败:" + result}})Button("加密步骤2").fontSize($r('app.float.submit_button_font_size')).fontWeight(CommonContants.FONT_WEIGHT).height(20).width(95).onClick(() => {let [result, data] = DonseeDevice.Donsee_iReadCardBas_HSM_Step2(this.pKkey)if (result == 0) {this.tvResult = "读卡成功:" + data} else {this.tvResult = "读卡失败:" + result}})} .margin({ top: 10 })}.justifyContent(FlexAlign.End).margin({right:10})}.justifyContent(FlexAlign.Start).width(CommonContants.FULL_PARENT)}.justifyContent(FlexAlign.Start).backgroundColor($r('app.color.card_background')).width(CommonContants.FULL_PARENT).height(CommonContants.FULL_PARENT)}}

相关文章:

身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包

项目需求,用ArkTS新一代开发语言实现了在Harmony鸿蒙系统上面兼容身份证阅读器和社保卡读卡器,调用了DonseeDeviceLib.har这个读卡库。 需要注意的是,鸿蒙系统的app扩展名为.hap,本项目编译输出的应用为:entry-default…...

并发与并行

并发和并行是操作系统中的两个重要概念,它们在定义和处理任务的方式上有一些区别。 并发(concurrency)是指在一段时间内,有多个程序都处于启动运行到运行完毕之间,但任一时刻点上只有一个程序在处理机上运行。它是一种…...

搭个网页应用,让ChatGPT帮我写SQL

大家好,我是凌览。 开门见山,我搭了一个网页应用名字叫sql-translate。访问链接挂在我的个人博客(https://linglan01.cn/about)导航栏,也可以访问https://www.linglan01.cn/c/sql-translate/直达sql-translate。 它的主要功能有:…...

实时云渲染 助力破解智慧园区痛点困局

智慧园区是运用先进的信息技术,如物联网(IoT)、大数据、云计算、人工智能、三维可视化等,对园区内的各类设施、资源以及管理进行智能化和数字化升级。其目标是通过科技手段提升园区的运营效率、资源利用率,提供更便捷、…...

计算机组成原理2

1.浮点数 2.IEEE 754 3.存储器的性能指标 4.存储器的层次化结构 主存类似手机运行内存8g ,辅存类似手机内存128g.... 辅存必须先通过主存才能被cpu接收,就例如微信打开那个月亮小人界面两三秒就是主存在读取辅存的程序然后被cpu接收运行。 5.主存储…...

Py之PyMuPDF:PyMuPDF的简介、安装、使用方法之详细攻略

Py之PyMuPDF:PyMuPDF的简介、安装、使用方法之详细攻略 目录 PyMuPDF的简介 PyMuPDF的安装 PyMuPDF的使用方法 1、基础用法 PyMuPDF的简介 PyMuPDF是一个高性能的Python库,用于PDF(和其他)文档的数据提取,分析,转换和操作。 …...

2023亚太杯数学建模A题B题C题思路模型代码论文指导

2023亚太地区数学建模A题思路:开赛后第一时间更新,获取见文末 名片 2023亚太地区数学建模B题思路:开赛后第一时间更新,获取见文末 名片 2023亚太地区数学建模C题思路:开赛后第一时间更新,获取见文末 名片…...

【C/PTA】函数专项练习(四)

本文结合PTA专项练习带领读者掌握函数,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。 目录 6-1 计算A[n]1/(1 A[n-1])6-2 递归实现顺序输出整数6-3 自然数的位数(递归版)6-4 分治法求解金块问题6-5 汉诺塔6-6 重复显示字符(递归版)…...

广西柳州机械异形零部件三维扫描3D抄数全尺寸测绘建模-CASAIM中科广电

一、背景介绍 复杂机械异形零部件具有不规则的形状和复杂的结构,给生产制造带来了很大的检测难度。为了确保零部件的制造质量和精度,需要对零部件进行全面的尺寸检测和分析。 CASAIM三维扫描仪在机械异形零部件全尺寸检测应用可以实现对机械异形零部件…...

(四)C语言之符号常量概述

(四)C语言之符号常量概述 一、符号常量概述 一、符号常量概述 在程序中使用像300,20等这样的等类似的“幻数”不是一个好的习惯,它们无法向阅读该程序的人提供更多有用的信息,从而使得修改程序变得困难。处理这种幻数的一种方法是…...

springboot -sse -flux 服务器推送消息

先说BUG处理&#xff0c;遇到提示异步问题 Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "<async-supported>true</async-supported&…...

js进阶笔记之原型,原型链

目录 1、原型对象 constructor 属性 对象原型 2、原型链 3、instanceof 4、原型继承 1、原型对象 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用就可以了。 面向对象是把事务分解成为…...

【DevOps】Git 图文详解(四):Git 使用入门

本系列包含&#xff1a; Git 图文详解&#xff08;一&#xff09;&#xff1a;简介及基础概念Git 图文详解&#xff08;二&#xff09;&#xff1a;Git 安装及配置Git 图文详解&#xff08;三&#xff09;&#xff1a;常用的 Git GUIGit 图文详解&#xff08;四&#xff09;&a…...

Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来 )

Jquery ajax 同步阻塞引起的UI线程阻塞的坑&#xff08;loading图片显示不出来&#xff0c;layer.load延迟&#xff09;jax重新获取数据刷新页面功能&#xff0c;因为ajax属于耗时操作&#xff0c;想在获取数据且加载页面时显示加载遮罩层&#xff0c;结果发现了ajax的好多坑。…...

读书笔记——《黑猩猩的政治》

前言 弗朗斯德瓦尔&#xff08;Frans de Waal)的代表作《黑猩猩政治》成书于1982年&#xff0c;是它的首部书籍作品&#xff0c;也是美国国会新任议员的被推荐读物。之前看的他另一部作品的《万智有灵》是2016年的作品&#xff0c;时间跨度居然这么大。《万智有灵》介绍了许多…...

此处不允许使用特性namespace

1.DOCTYPE 后面改成 mapper 2.PUBLIC一行中的Config改为Mapper 3.将下一行config变为小写的mapper <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.or…...

随笔记录-springmvc_ResourceHandlerRegistry+ResourceHttpRequestHandler

环境&#xff1a;springboot-2.7.5 配置文件配置静态资源映射 springboot配置静态资源映射方式是通过 WebMvcAutoConfiguration 实现的 spring: # resources: # # 自springboot 2.5.5之后&#xff0c;该属性已经被废弃&#xff0c;使用spring.web.resources.static-locat…...

Redis面试内容,Redis过期策略,Redis持久化方式,缓存穿透、缓存击穿和缓存雪崩,以及解决办法

文章目录 一、redis什么是RedisRedis使用场景1、缓存2、数据共享[分布式](https://so.csdn.net/so/search?q分布式&spm1001.2101.3001.7020)3、分布式锁4、全局ID5、计数器6、限流7、位统计 Redis有5中数据类型&#xff1a; SSHLZRedis中一个key的值每天12点过期&#xff…...

爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;不服输的你&#xff0c;他们拿什么赢 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请点赞…...

ubuntu Setforeground 前台应用切换

场景分析 有这样一个系统&#xff0c;一个服务主进程用于接收指令&#xff0c;其它服务是独立的gui 程序&#xff0c;服务进程根据命令将对应的gui 程序切换到前台。 windows 平台有Setforeground 这个api&#xff0c;可以根据进程ID&#xff0c;将某个应用的窗口切换到前台。…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...