Android NFC NFA读取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39238370/article/details/90018859

      弄到一个Nfca类型的不知道怎么读。我们以前用的是MifareUltralight类型,那个简单直接拿到readPage,读取扇区就行。好了,从头开始百度 android nfca 标签怎么读取。ok有一堆,几乎都没有用,别问我怎么知道的。我这个菜鸡弄这个弄了整整两天,然而大部分时间都是混水。开始了贴代码,

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        //当该Activity接收到NFC标签时,运行该方法
        //调用工具方法,读取NFC数据
        //获取到Tag标签对象
        mTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        String[] techList = mTag.getTechList();
        Log.e("标签支持的tachnology类型:", "");
        System.out.println("标签支持的tachnology类型:");
        for (String tech : techList) {
            Log.e("标签支持的tachnology类型:", tech);
            stringBuffer.append(tech + ",");
        }
        stringBuffer.append("\n");

      /*  try {
            ndef.connect();
            boolean connected = ndef.isConnected();
            byte[] id = mTag.getId();
            for (int i = 0; i < id.length; i++) {
                Log.e("ididid","---"+id[i]);
            }
            if(connected){
                Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                        NfcAdapter.EXTRA_NDEF_MESSAGES);

              *//*  if(ndefMessage!=null){
                    NdefRecord[] records = ndefMessage.getRecords();
                    Toast.makeText(this, "records"+ndefMessage, Toast.LENGTH_SHORT).show();
                }*//*


            }
        } catch (IOException e) {
            e.printStackTrace();
        }*/


        NfcA nfcA = NfcA.get(mTag);
        try {
            nfcA.connect();
        } catch (IOException e) {
            e.printStackTrace();
        }


        boolean connected = nfcA.isConnected();
        if (connected) {
            Toast.makeText(this, "连接成功", Toast.LENGTH_SHORT).show();
/*
            byte[] DATA_READ = new byte[]{
                    (byte) 0X11,(byte)0x00, (byte) 0xef
            };*/
      //NTAG216的芯片
            byte[] DATA_READ = {
                    (byte) 0x30,
                    (byte) 8 & 0x0ff,//0x05
            };


            try {
                data_res = nfcA.transceive(DATA_READ);
            } catch (IOException e) {
                e.printStackTrace();
                Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT).show();
            }

            stringBuffer.append("TagId:");
            byte[] mTagId = mTag.getId();
            for (int i = 0; i < mTagId.length; i++) {
                Log.e("TagId", mTagId[i] + "");
                stringBuffer.append(mTagId[i]);
            }
            stringBuffer.append("\n");

            stringBuffer.append("atqa1:");
            byte[] atqa1 = nfcA.getAtqa();
            for (int i = 0; i < atqa1.length; i++) {
                Log.e("atqa1", atqa1[i] + "");
                stringBuffer.append(atqa1[i] + ",");
            }
            stringBuffer.append("\n");


            short sak = nfcA.getSak();
            stringBuffer.append("sak:" + sak + "\n");

            textView.setText(stringBuffer.toString() + nfcA.getMaxTransceiveLength());

            if (data_res == null) {
                return;
            }
            if (data_res.length > 0) {
                Toast.makeText(this, "读取成功", Toast.LENGTH_SHORT).show();
                for (int i = 0; i < data_res.length; i++) {
                    Log.e("dataRes" + i + "------", data_res[i] + "");

                }
                String s = new String(data_res, Charset.forName("utf-8"));
                Log.e("dataRes", s);
            }
        } else
            Toast.makeText(this, "连接失败", Toast.LENGTH_SHORT).show();

我也开始也不明白,nfca的 transceive()这个方法,之所以这么少是因为的,这个nfc对应的厂家有不同的命令我之前还

问做硬件的这个命令是什么,他也不知道,然后我们有一份文档找到了这个,下面这个读取十六字节的命令,后来这个也是不行

,还爆了(Taw lost)因为我们的nfc不是这个类型的。然后在网上看到一片文章,用了下他的命令就成功了!!另外以我的理解

0x30 是读的命令,0x08应该是读取到那个扇区。好了,祝你成功。

大佬文章:https://blog.csdn.net/shjn2004/article/details/52287927

猜你喜欢

转载自blog.csdn.net/qq_39238370/article/details/90018859