Android Studio安卓读取EM4100 TK4100卡卡号源码

本示例使用的读卡器:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-21818769070.35.44005b43nb1q2h&id=562957272162

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="3dp"
    tools:context=".IdCardActivity">
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:background="?attr/colorPrimary"
        app:navigationIcon="@drawable/baseline_arrow_back_ios_24"
        app:titleTextColor="@color/white"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteY="0dp">

        <TextView
            android:id="@+id/TextViewlabelDispleft"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="返回"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:gravity="center"
            android:onClick="retmain" />

        <TextView
            android:id="@+id/TextViewlabelDisp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="ID卡、HID卡测试页  "
            android:textColor="@color/white"
            android:textSize="16sp"
            android:gravity="center_horizontal|right|center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/TextViewlabelDispleft"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.appcompat.widget.Toolbar>

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="fill_parent"
        android:layout_height="150dp"
        android:padding="3dp"
        android:text="操作结果"
        android:textSize="12sp"
        android:background="@drawable/shape4border"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"  />

    <ScrollView
        android:id="@+id/scrollViewIC"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_marginBottom="5dp"

        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:layout_constraintBottom_toTopOf="@+id/sample_text"
        android:scrollbars="horizontal"
        >

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="3dp"   >

            <Button
                android:id="@+id/btnReadID"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:padding="3dp"
                android:onClick="idr_read"
                android:text="读卡"
                app:layout_constraintStart_toStartOf="@+id/btnReadOnceID"
                app:layout_constraintEnd_toEndOf="@+id/btnReadOnceID"
                app:layout_constraintTop_toTopOf="parent" />


            <Button
                android:id="@+id/btnReadOnceID"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="idr_read_once"
                android:text="仅读一次,重新取放卡才能读到第二次"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.5"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/btnReadID"/>

            
        </androidx.constraintlayout.widget.ConstraintLayout>


    </ScrollView>


</androidx.constraintlayout.widget.ConstraintLayout>
package com.usbreadertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.reader.ouridr;

public class IdCardActivity extends AppCompatActivity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_id_card);
        androidx.appcompat.widget.Toolbar toolbar=findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tv = findViewById(R.id.sample_text);
        tv.setText("操作结果");
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==android.R.id.home){
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void retmain(View view)
    {
        finish();
    }

    //读ID卡
    public void idr_read(View view)
    {
        byte status;//存放返回值
        byte[] idserial = new byte[5];

        String strls;
        status = ouridr.read(idserial);
        if(status == 0)
        {
            ouridr.beep(38);
            strls = "读卡成功!16进制卡号为:";
            String strls1 = "0"+Integer.toHexString(idserial[0]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[1]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[2]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[3]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[4]);
            strls = strls + strls1.substring(strls1.length()-2);

            long cardhao;
            cardhao = idserial[1] & 0xff;
            cardhao *= 256;
            cardhao += idserial[2] & 0xff;
            cardhao *= 256;
            cardhao += idserial[3] & 0xff;
            cardhao *= 256;
            cardhao += idserial[4] & 0xff;
            String card8h10d = "000000000"+Long.toString(cardhao);//0305887634  123B7992
            card8h10d=card8h10d.substring(card8h10d.length()-10,card8h10d.length());
            strls=strls+"\n转8H10D码:"+card8h10d;

            String WG341="00000"+Integer.toString((idserial[3]& 0xff)*256+(idserial[4]& 0xff));
            WG341=WG341.substring(WG341.length()-5,WG341.length());
            String WG342="00000"+Integer.toString((idserial[1]& 0xff)*256+(idserial[2]& 0xff));
            WG342=WG342.substring(WG342.length()-5,WG342.length());
            strls=strls+"\n转韦根34码:"+WG341+WG342;

            String WG261="000"+Integer.toString(idserial[2]& 0xff);
            WG261=WG261.substring(WG261.length()-3,WG261.length());
            String WG262="00000"+Integer.toString((idserial[3]& 0xff)*256+(idserial[4]& 0xff));
            WG262=WG262.substring(WG262.length()-5,WG262.length());
            strls=strls+"\n转韦根26码:"+WG261+WG262;

            tv.setText(strls);
        } else {
            PrintErrInf(status);
        }
    }

    //仅读一次ID卡,重新取放卡才能读到第二次
    public void idr_read_once(View view)
    {
        byte status;//存放返回值
        byte[] idserial = new byte[5];

        String strls;
        status = ouridr.readonce(idserial);
        if(status == 0)
        {
            ouridr.beep(38);
            strls = "读卡成功!16进制卡号为:";
            String strls1 = "0"+Integer.toHexString(idserial[0]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[1]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[2]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[3]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(idserial[4]);
            strls = strls + strls1.substring(strls1.length()-2);

            long cardhao;
            cardhao = idserial[1] & 0xff;
            cardhao *= 256;
            cardhao += idserial[2] & 0xff;
            cardhao *= 256;
            cardhao += idserial[3] & 0xff;
            cardhao *= 256;
            cardhao += idserial[4] & 0xff;
            String card8h10d = "000000000"+Long.toString(cardhao);//0305887634  123B7992
            card8h10d=card8h10d.substring(card8h10d.length()-10,card8h10d.length());
            strls=strls+"\n转8H10D码:"+card8h10d;

            String WG341="00000"+Integer.toString((idserial[3]& 0xff)*256+(idserial[4]& 0xff));
            WG341=WG341.substring(WG341.length()-5,WG341.length());
            String WG342="00000"+Integer.toString((idserial[1]& 0xff)*256+(idserial[2]& 0xff));
            WG342=WG342.substring(WG342.length()-5,WG342.length());
            strls=strls+"\n转韦根34码:"+WG341+WG342;

            String WG261="000"+Integer.toString(idserial[2]& 0xff);
            WG261=WG261.substring(WG261.length()-3,WG261.length());
            String WG262="00000"+Integer.toString((idserial[3]& 0xff)*256+(idserial[4]& 0xff));
            WG262=WG262.substring(WG262.length()-5,WG262.length());
            strls=strls+"\n转韦根26码:"+WG261+WG262;

            tv.setText(strls);
        } else {
            PrintErrInf(status);
        }
    }

    public void PrintErrInf(byte errcode) {
        String dispstr;
        switch(errcode){
            case 8:
                dispstr="错误代码:8,未寻到卡,请重新将卡放在ID卡读卡器感应区!";
                break;
            case 22:
                dispstr="错误代码:22,动态库或驱动程序异常!";
                break;
            case 23:
                dispstr="错误代码:23,发卡器未连接!";
                break;
            case 24:
                dispstr="错误代码:24,读卡器可能没有该功能!";
                break;
            default:
                dispstr="未知错误,错误代码:"+Integer.toString(errcode);
                break;
        }
        tv.setText(dispstr);
    }

}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习从0到1 day3 python变量和debug

没关系&#xff0c;这破败的生活压不住我 ——24.1.13 一、变量的定义 1.什么是量&#xff1f; 量是程序运行中的最小单元 2.什么是变量呢&#xff1f; ①变量是存储数据的容器 ②变量存储的数据时临时的&#xff0c;变量只有在程序运行过程中是有效的&#xff0c;当程序执行结…

TreesVariety

树木品种 - 树木和植物捆绑包。与“植被引擎”兼容的包装 通用和HDRP的树木包在这里 树木品种: ● 支持Unity Wind; ● 11种树木,7种植物; ● Unity树创建器树(可编辑); ● 与内置管道配合使用; ● 支持地形广告牌。 树木: ● 8棵桦树; ● 4块枫木; ● 8块橡木; ●…

第八讲 单片机驱动彩色液晶屏 控制RA8889软件:显示图片

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

【排序篇1】插入排序、希尔排序

目录 一、插入排序二、希尔排序 一、插入排序 思路&#xff1a; 插入排序就像玩扑克牌&#xff0c;抽出一张牌作为比较的元素&#xff0c;与前面的牌依次进行比较&#xff0c;小于继续往前比较&#xff0c;大于等于停下插入到当前位置。 图示&#xff1a; void InsertSort(…

DNS域名解析以及操作流程

dns:将域名转化为IP地址的过程&#xff0c;域名方便人们记忆&#xff0c;ip地址过长&#xff0c;且都是数字&#xff0c;不方便记忆&#xff0c;所以才出现了域名。 怎么实现访问域名等于访问ip地址 1.老方法&#xff1a;写入文件里 /etc/hosts 左边 IP地址 右边域名 格式例…

S1-05二进制信号量和计数器信号量

二进制信号量 二进制信号量&#xff0c;又叫二值信号量&#xff0c;要么是0&#xff0c;要么是1&#xff0c;也是通过Take和Give方式获取和释放&#xff0c;用于控制对共享资源的访问。在每次访问共享资源之前需要获取二进制信号量&#xff0c;若已被获取则任务会被阻塞直到二…

技术专栏——你所不知道的 RocketMQ 的集群管理:副本机制

这些精彩的技术类型的体系化文章&#xff0c;后面我会放到公众号上&#xff0c;并集中在合集“分布式消息中间件专栏”中&#xff0c;欢迎大家去订阅我的公众号和视频号“架构随笔录”&#xff0c;大家可以订阅合集&#xff0c;这样更加方便喔&#xff0c;后面会出电子版本&…

电脑上不安装Oracle,但是虚拟机装了Oracle,怎么连接到虚拟机里的Oracle数据库呢?

1、准备工作 1.1、确定数据库版本信息 注&#xff1a;如果知道数据库的版本信息&#xff0c;这个步骤可以跳过。 比较简单的方法&#xff0c;直接看数据库的安装位置&#xff0c;也就是数字&#xff08;但是这个方法确定就是&#xff0c;不好确定是多少位的数据库&#xff09;…

AI智能分析网关V4烟火检测算法解决方案

一、背景需求 根据国家消防救援局公布的数据显示&#xff0c;2023年共接报处置各类警情213.8万起&#xff0c;督促整改风险隐患397万处。火灾危害巨大&#xff0c;必须引起重视。传统靠人工报警的方法存在人员管理难、场地数量多且分散等问题&#xff0c;无法有效发现险情降低…

微信小程序(二)事件绑定

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 点击事件绑定注册页面设置页面初始化数据事件处理函数的实现更新数据并更新视图 源码&#xff1a; index.wxml <!-- 页面的数据绑定 --> <view>{{msg}}</view> <!-- 绑定点击事件 --> <but…

openssl3.2 - 官方demo学习 - cipher - aesgcm.c

文章目录 openssl3.2 - 官方demo学习 - cipher - aesgcm.c概述笔记END openssl3.2 - 官方demo学习 - cipher - aesgcm.c 概述 AES-256-GCM 在这个实验中验证了EVP_CIPHER_fetch()中算法名称字符串的来源定位. 在工程中配置环境变量PATH, 且合并环境. 这样就不用将openSSL的D…

【Python】编程练习的解密与实战(四)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1fa90;1. 初识Python &a…

Spring Boot - Application Events 的发布顺序_ApplicationStartedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

linux 服务器上安装 ftp(亲测有效)

目录 1 需求2 安装 1 需求 服务器上需要安装ftp 2 安装 1 下载地址 https://developer.aliyun.com/packageSearch?wordvsftpd或者 https://rpmfind.net/linux/rpm2html/search.php?queryvsftpd2 如何判断 服务器是否安装了ftp rpm -qa | grep vsftpd出现提示则表示已安装…

什么是国密算法

国密算法是指由中国国家密码管理局发布的密码算法标准&#xff0c;旨在保障国家信息安全。目前&#xff0c;国家密码管理局已发布了一系列国产商用密码标准算法&#xff0c;包括SM1&#xff08;SCB2&#xff09;、SM2、SM3、SM4、SM7、SM9以及祖冲之密码算法&#xff08;ZUC)等…

thinkphp学习09-数据库的数据新增

单数据新增 使用 insert()方法可以向数据表添加一条数据&#xff0c;更多的字段采用默认 public function index() {$data [username > 犬夜叉,password > 123,gender > 男,email > wjl163.com,price > 999,details > 犬夜叉介绍];echo Db::name(user)-&g…

【教学类-43-18】A4最终版 20240111 数独11.0 十宫格X*Y=Z套(n=10),套用没有分割行列的A4横版模板

作品展示&#xff1a; 撑满格子的10宫格数独50%难度 50空 背景需求&#xff1a; 大4班有3位男孩做9宫格数独&#xff08;81格子&#xff0c;30%难度 24空&#xff09;非常娴熟&#xff0c;我观察他们基本都在10分钟内完成&#xff0c;其中一位男孩把九宫格题目给我看时表达自…

android 13.0 Launcher3长按app弹窗设置为圆角背景功能实现二

1.前言 在13.0的系统ROM定制化开发中,在进行一些Launcher3的定制化开发中,在使用app的弹窗的功能时,会弹出应用信息和 微件之类的内容,所以在定制需求中,需要默认设置为圆角背景,接下来就来分析下相关功能的实现如图: 2.Launcher3长按app弹窗设置为圆角背景功能实现二的…

【目标检测】评价指标:混淆矩阵概念及其计算方法(yolo源码)

本篇文章首先介绍目标检测任务中的评价指标混淆矩阵的概念&#xff0c;然后介绍其在yolo源码中的实现方法。 目标检测中的评价指标&#xff1a; mAP概念及其计算方法(yolo源码/pycocotools) 混淆矩阵概念及其计算方法(yolo源码) 本文目录 1 概念2 计算方法 1 概念 在分类任务中…

rime中州韵小狼毫 汉语拼音输入方案

在word中&#xff0c;我们可以轻易的给汉字加上拼音&#xff0c;如下&#x1f447;&#xff1a; 但是&#xff0c;如何单独的输入拼音呢&#xff1f;例如输入 pīn yīn, 再如 zhōng guō。今天我们分享一个使用rime中州韵小狼毫须鼠管输入法配置的输入汉语拼音的输入方案。功…