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

news2024/9/21 15:42:16

项目需求,用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 // 当前选中项id
  build() {


        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.imgBase64
                      this.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 = 1
                    if (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.name
                      this.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)


      }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 如何使用 MySQL 8.2 读写分离?

在这篇文章中,我们将了解如何将 MySQL 8.2 的读写分离功能与 MySQL-Connector/Python 一起使用。 作者:Frederic Descamps,MySQL 社区经理 本文和封面来源:https://blogs.oracle.com/,爱可生开源社区翻译。 本文约 120…

Django学习日志08

如何开启事务 事务的目的:为了保证多个SQL语句执行成功,执行失败,前后保持一致,保证数据安全 ACID属性: A:原子性(Atomicity):指事务是原子的,对事务中的操…

-bash: jps: command not found

背景 服务器的jdk通过yum 安装的,要用jps查询pid,提示找不到命令 yum install -y java-1.8.0-openjdk.x86_64 一、jps命令无法找到 [devhgh-tob-hsbc-dev-003 ~]$ jps -bash: jps: command not found 二、检查基础Java环境 [devhgh-tob-hsbc-dev-003 ~]…

在UOS系统中编译CEF源码

一、下载cef代码 git clone gitbitbucket.org:chromiumembedded/cef.git 二、执行自动下载代码 由于chromium的代码很大,至少需要准备大概80G的硬盘!!!整个代码量太大还是多准备一些空间吧(强烈建议使用固态硬盘保存否…

链动2+1模式:创新营销引领白酒产业新潮流

在当今高度竞争的市场环境中,创新营销模式对于企业的发展至关重要。链动21模式作为一种独特的营销策略,将白酒产品与该模式相结合,充分发挥其优势,通过独特的身份晋升和奖励机制,快速建立销售渠道,提高用户…

JAXB:根据Java文件生成XML schema文件

说明 JAXB有个schemagen脚本&#xff0c;可以根据Java文件生成XML schema。这个工具在JAXB独立发布包中有&#xff0c;可以从官网下载JAXB的独立发布包&#xff1a; https://eclipse-ee4j.github.io/jaxb-ri/ 示例 使用schemagen -d <path> <java files>格式 …

一篇博客读懂双向链表

目录 一、双向带头循环链表的格式 二、链表的初始化和销毁 2.1链表的初始化 2.2链表的销毁 三、链表的检查与准备 3.1链表的打印 3.2创建新结点 四、链表增删查改 4.1尾插 4.2尾删 4.3头插 4.4头删 4.5查找 4.6任意位置前插入 4.7删除任意位置 一、双向带…

【算法-哈希表4】 三数之和(去重版)

今天&#xff0c;带来哈希相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 三数之和 分析题意 这就是三数之和去重版嘛。 题意转化 求三元组, 满足每个元素相加为0&#xff0c;其中每个元素下标不同&#xff1b;而得到的三元组不能重复。 构成三元…

微信私域运营工具CRM

为什么要做微信私域&#xff1f; 客户在哪里&#xff1f;微信&#xff01;在中国&#xff0c;不论男女老少&#xff0c;90%的人每天使用微信至少5次&#xff0c;每次使用时间超过90分钟&#xff0c;已经成为像吃饭穿衣一样的生活必需品。因此&#xff0c;我们的目标客户就在微…

4-5学生分数对应的成绩

![#include<stdio.h> int main(){float score;char grade;for(int i0;i<7;i){printf("请输入成绩&#xff1a;");scanf("%f",&score);while(score>100||score<0){printf("\n输入的成绩有误&#xff0c;请重新输入&#xff1a;&quo…

进程管理(四)

管程概念及实现要旨 管程引入了条件变量condition。 wait操作,把当前进程挂到条件变量对应的阻塞队列上去,signal把条件队列上的对手进程唤醒。 注意:条件变量的signal操作和信号量的signal是有区别的。条件变量的signal可能啥都不干,如果有阻塞的进程唤醒,没有啥事都不做…

【ARM Trace32(劳特巴赫) 使用介绍 10 -- Trace32 scan dump 详细介绍】

文章目录 1.1 JTAG 测试逻辑架构1.2 D型扫描触发器1.2.1 全扫描介绍1.3 IR 寄存器1.4 TDR(Test data registers)1.4.1 TDR 的实现1.4.1.1 Bypass Register1.4.1.2 Boundary-scan register1.5 Scan Dump1.5.1 soft fusion1.1 JTAG 测试逻辑架构 图 1-1 片上测试逻辑概念图 如前面…

京东小程序:无代码开发实现API集成,连接电商平台、CRM和客服系统

无需复杂API开发&#xff0c;京东小程序连接电商平台 京东小程序平台以其全开放的生态模式&#xff0c;让商家享有京东系APP流量福利、海量SKU和开放能力&#xff0c;提升用户体验&#xff0c;同时也带来了新商机。京东小程序的最大优势在于&#xff0c;商家无需进行复杂的API…

传统词嵌入方法的千层套路

诸神缄默不语-个人CSDN博文目录 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词嵌入是一种将词语转换为数值形式的方法&#xff0c;使计算机能够理解和处理语言数据。 词嵌入word embedding也叫文本向量化/文本表征。 本文将介绍几种流行的传统词嵌入方法。 文…

SpringBoot2—运维实用篇

目录 打包与运行 • 程序打包与运行&#xff08;Windows版&#xff09; • 程序运行&#xff08;Linux版&#xff09; 配置高级 • 临时属性设置 • 配置文件分类 • 自定义配置文件 多环境开发 多环境开发&#xff08;yaml单一文件版&#xff09; 多环境开发&am…

『亚马逊云科技产品测评』活动征文|通过lightsail一键搭建Drupal VS 手动部署

『亚马逊云科技产品测评』活动征文&#xff5c;通过lightsail一键搭建Drupal 提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚…

Debian系列的Linux发行版上部署wvp

Debian系列的Linux发行版上部署wvp 环境搭建1.Debian系列的Linux发行版上安装nginx2.安装mysql设置mysql密码修改权限sudo mysql ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)配置相关navicat 连接不上 报错 10061navicat 连接报错 1130 -…

【考研数学】正交变换后如果不是标准型怎么办?| 关于二次型标准化的一些思考

文章目录 引言一、回顾二次型的定义是什么&#xff1f;什么叫标准二次型&#xff1f;怎么化为标准型&#xff1f; 二、思考写在最后 引言 前阵子做了下 20 年真题&#xff0c;问题大大的&#xff0c;现在订正到矩阵的第一个大题&#xff0c;是关于二次型正交变换的。和常规不同…

从硬件到软件:揭秘磁盘结构和文件系统组织

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了从磁盘的硬件结构&#xff0c;再到操作系统内部是…

STM32获取最大堆栈空间

参考 stackflow相关讨论 原理 通过参考链接&#xff0c;可知探测Stack的最大深度是先在stack中填充不常用的特定值&#xff0c;然后实时检测这些值哪些发生了变化&#xff0c;变化的表示使用到了这个空间&#xff0c;如果程序完全遍历后&#xff0c;有些值还是没变&#xff…