安卓Android下如何开发USB NFC读写器APP

        荣士第二代USB免驱动IC读写器IC-02支持Windows、安卓(Android)、Linux系统,为方便IC-02读写器能快速的接入安卓(Android)系统,我们提供了各种安卓版本的So库及示例源码,安卓工程师可直接拷贝以下代码使用到项目中。

安卓Android下如何开发USB NFC读写器APP_第1张图片

安卓Android下如何开发USB NFC读写器APP_第2张图片

 读写器介绍: 

RFID读写器NFC发卡器WEB可编程NDEF文本/网址/智能海报/电话/启动-淘宝网 (taobao.com)https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.183d789e5MFoI2&id=615391857885

Android Studio源码:

package com.ic.ic02test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.reader.ourmifare;  //引入我们的读写器类

public class MainActivity extends AppCompatActivity {

    private TextView tv;
    //读写卡操作控制字指定,
    private static final byte BLOCK0_EN = 0x01;        //允许读写第0块
    private static final byte BLOCK1_EN = 0x02;        //允许读写第1块
    private static final byte BLOCK2_EN = 0x04;        //允许读写第2块
    private static final byte NEEDSERIAL = 0x08;       //仅读指定序列号的卡
    private static final byte EXTERNKEY = 0x10;        //需要指定密码
    private static final byte NEEDHALT = 0x20;         //休眠卡

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        tv = findViewById(R.id.sample_text);
        tv.setText("操作结果");
    }

    //读取IC卡卡号------------------------------------------------------------------------
    public void piccrequest(View view)
    {
        byte status;//存放返回值
        byte[] mypiccserial = new byte[4];
        long cardhao;

        String strls = "";
        status = ourmifare.piccrequest(this,mypiccserial);

        if(status == 0)
        {
            strls = "读取成功!卡号为";
            cardhao = mypiccserial[3] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[2] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[1] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[0] & 0xff;
            String strls1 = "000000000"+Long.toString(cardhao);//0305887634  123B7992
            strls = strls + strls1.substring(strls1.length()-10);
        }
        else
        {
            if(status == 8)
            {
                strls = "请将卡放在IC卡读卡器感应区";
            }
            else if(status == 23)
            {
                strls = "错误提示:读卡器未插入";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }
        }
        tv.setText(strls);
    }

    //轻松读卡,返回4字节卡号及48字节扇区数据-----------------------------------------------
    public void piccreadex(View view)
    {
        byte status;//存放返回值
        byte myareano;//区号
        byte authmode;//密码类型,用A密码或B密码
        byte myctrlword;//控制字
        byte[] mypiccserial = new byte[4];//卡序列号
        byte[] mypicckey = new byte[6];//密码
        byte[] mypiccdata = new byte[48];//卡数据缓冲
         
        myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;  //控制字指定
        myareano = 8;//指定为第8区         
        authmode = 1;  //批定密码模式,大于0表示用A密码认证,推荐用A密码认证

        //指定密码
        mypicckey[0] = (byte)0xFF;
        mypicckey[1] = (byte)0xFF;
        mypicckey[2] = (byte)0xFF;
        mypicckey[3] = (byte)0xFF;
        mypicckey[4] = (byte)0xFF;
        mypicckey[5] = (byte)0xFF;

        long cardhao;

        String strls = "";
        status = ourmifare.piccreadex(this,myctrlword,mypiccserial,myareano,authmode,mypicckey,mypiccdata);

        if(status == 0)
        {
            strls = "读取成功!卡号为";
            cardhao = mypiccserial[3] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[2] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[1] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[0] & 0xff;

            String strls1 = "000000000"+Long.toString(cardhao);//0305887634
            strls += strls1.substring(strls1.length()-10);

            strls += ",扇区数据为";

            for(int i = 0;i < 47;i++)
            {
                strls1 = "0"+Integer.toHexString(mypiccdata[i] & 0xff);
                strls = strls + strls1.substring(strls1.length()-2) +"-";
            }
            String CardShopId=new String(mypiccdata);
            String CardId=CardShopId.substring(1,16) ;
            String ShopId=CardShopId.substring(17,35) ;
            strls1 = "0"+Integer.toHexString(mypiccdata[47] & 0xff);
            strls = strls + strls1.substring(strls1.length()-2);
        }
        else
        {
            if(status == 8)
            {
                strls = "请将卡放在IC卡读卡器感应区";
            }
            else if(status == 23)
            {
                strls = "错误提示:读卡器未插入";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }
        }
        tv.setText(strls);
    }

    //轻松写卡:8区,密码12个F,数据1-48,返回4字节卡号-----------------------------------------
    public void piccwriteex(View view)
    {
        byte status;//存放返回值
        byte myareano;//区号
        byte authmode;//密码类型,用A密码或B密码
        byte myctrlword;//控制字
        byte[] mypiccserial = new byte[4];//卡序列号
        byte[] mypicckey = new byte[6];//密码
        byte[] mypiccdata = new byte[48];//卡数据缓冲

        myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;    //控制字指定,
        myareano = 8;//指定区号为第8区
        authmode = 1;//批定密码模式,大于0表示用A密码认证,推荐用A密码认证

        //指定密码
        mypicckey[0] = (byte)0xFF;
        mypicckey[1] = (byte)0xFF;
        mypicckey[2] = (byte)0xFF;
        mypicckey[3] = (byte)0xFF;
        mypicckey[4] = (byte)0xFF;
        mypicckey[5] = (byte)0xFF;

        String CardId="0000000000123456";
        String ShopId="0000000000987654321";
        String WriteStr=CardId + ShopId +"                       ";//写入信息补足不小于48字节
        byte[] WriteBuf=WriteStr.getBytes() ;

        for(int i = 0;i < 48;i++)
        {
            mypiccdata[i] = WriteBuf[i];
        }

        long cardhao;

        String strls = "";
        status = ourmifare.piccwriteex(this,myctrlword,mypiccserial,myareano,authmode,mypicckey,mypiccdata);

        if(status == 0)
        {
            strls = "写卡成功!卡号为";
            cardhao = mypiccserial[3] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[2] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[1] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[0] & 0xff;

            String strls1 = "000000000"+Long.toString(cardhao);//0305887634
            strls += strls1.substring(strls1.length()-10);

            strls += ",写入扇区数据为";

            for(int i = 0;i < 47;i++)
            {
                strls1 = "0"+Integer.toHexString(mypiccdata[i] & 0xff);
                strls = strls + strls1.substring(strls1.length()-2) +"-";
            }

            strls1 = "0"+Integer.toHexString(mypiccdata[47] & 0xff);
            strls = strls + strls1.substring(strls1.length()-2);

        }
        else
        {
            if(status == 8)
            {
                strls = "请将卡放在IC卡读卡器感应区";
            }
            else if(status == 23)
            {
                strls = "错误提示:读卡器未插入";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }
        }
        tv.setText(strls);
    }

    //改单区密码:8区,密码12个F,改成12个F,返回4字节卡号"-------------------------------------
    public void piccchangesinglekeyex(View view)
    {
        byte status;//存放返回值

        byte myareano;//区号
        byte authmode;//密码类型,用A密码或B密码
        byte myctrlword;//控制字
        byte[] mypiccserial = new byte[4];//卡序列号
        byte[] mypicckeyold = new byte[6];//密码
        byte[] mypicckeynew = new byte[17];//卡数据缓冲

        myctrlword = EXTERNKEY;    //指定本次操作的控制字
        myareano = 8;//指定区号为第8区
        authmode = 1;//指定密码认证模式,大于0表示用A密码认证,推荐用A密码认证

        //旧密码
        mypicckeyold[0] = (byte)0xFF;
        mypicckeyold[1] = (byte)0xFF;
        mypicckeyold[2] = (byte)0xFF;
        mypicckeyold[3] = (byte)0xFF;
        mypicckeyold[4] = (byte)0xFF;
        mypicckeyold[5] = (byte)0xFF;

        //新A密码
        mypicckeynew[0] = (byte)0xFF;
        mypicckeynew[1] = (byte)0xFF;
        mypicckeynew[2] = (byte)0xFF;
        mypicckeynew[3] = (byte)0xFF;
        mypicckeynew[4] = (byte)0xFF;
        mypicckeynew[5] = (byte)0xFF;

        //访问位,不要轻易改,改错卡将做废  FF078069
        mypicckeynew[6] = (byte)0xFF;
        mypicckeynew[7] = (byte)0x07;
        mypicckeynew[8] = (byte)0x80;
        mypicckeynew[9] = (byte)0x69;

        //新B密码
        mypicckeynew[10] = (byte)0x00;
        mypicckeynew[11] = (byte)0x00;
        mypicckeynew[12] = (byte)0x00;
        mypicckeynew[13] = (byte)0x00;
        mypicckeynew[14] = (byte)0x00;
        mypicckeynew[15] = (byte)0x00;

        //选项
        mypicckeynew[16] = (byte)0x00;//为0表示只改A官密码 为1表示改A密码同时也改B密码,为3表示改AB密码及访问位,警示:不要轻易改访问位

        long cardhao;

        String strls = "";
        status = ourmifare.piccchangesinglekeyex(this,myctrlword,mypiccserial,myareano,authmode,mypicckeyold,mypicckeynew);

        if(status == 0)
        {
            strls = "修改密码成功!卡号为";
            cardhao = mypiccserial[3] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[2] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[1] & 0xff;
            cardhao *= 256;
            cardhao += mypiccserial[0] & 0xff;
            String strls1 = "000000000"+Long.toString(cardhao);//0305887634
            strls += strls1.substring(strls1.length()-10);
        }
        else
        {
            if(status == 8)
            {
                strls = "请将卡放在IC卡读卡器感应区";
            }
            else if(status == 23)
            {
                strls = "错误提示:读卡器未插入";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }
        }
        tv.setText(strls);
    }


    //读出设备全球唯一的设备编号,作为加密狗用----------------------------------------------
    public void pcdgetdevicenumber(View view)
    {
        byte status;//存放返回值
        byte[] devicenumber = new byte[4];

        String strls = "";
        status = ourmifare.pcdgetdevicenumber(this,devicenumber);

        if(status == 0)
        {
            strls = "读取成功!设备编号为";
            String strls1 = "0"+Integer.toHexString(devicenumber[0]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(devicenumber[1]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(devicenumber[2]);
            strls = strls + strls1.substring(strls1.length()-2) +"-";
            strls1 = "0"+Integer.toHexString(devicenumber[3]);
            strls = strls + strls1.substring(strls1.length()-2);
        }
        else
        {
            if(status == 23)
            {
                strls = "错误提示:读卡器未插入";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }
        }
        tv.setText(strls);
    }

    //让设备发出声响----------------------------------------------------------------------
    public void beep(View view)
    {
        byte status;//存放返回值
        String strls = "";
        status = ourmifare.pcdbeep(this,50);

Android App源代码下载:USB-IC读写器M1IC卡Android示例源码.rar-其它文档类资源-CSDN文库icon-default.png?t=M4ADhttps://download.csdn.net/download/zhangjin7422/20960780

你可能感兴趣的:(IC读写器,18002295132,QQ:954486673,android,studio,安卓APP,android,NFC,App,Android,USB,NFC,Android,App)