版权声明:本文为博主原创文章,未经博主允许不得转载。 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