package com.example.chenqiuyang.nfcread;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
import android.nfc.tech.MifareUltralight;
import android.os.Parcelable;
import android.util.Log;
import android.widget.Toast;
import java.util.Arrays;
/**
* TODO:功能说明 Nfc工具类
*
* @author: chenqiuyang
* @date: 2018-07-12 11:33
*/
public class NfcUtil {
private static final String TAG = "NfcUtil";
/**
* 解析 ndefRecord 文本数据
* @param ndefRecord
* @return
*/
public static String parse(NdefRecord ndefRecord) {
// verify tnf 得到TNF的值
if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
return null;
}
// 得到字节数组进行判断
if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
return null;
}
try {
// 获得一个字节流
byte[] payload = ndefRecord.getPayload();
// payload[0]取第一个字节。 0x80:十六进制(最高位是1剩下全是0)
String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8"
: "UTF-16";
// 获得语言编码长度
int languageCodeLength = payload[0] & 0x3f;
// 获得语言编码
String languageCode = new String(payload, 1, languageCodeLength,
"US-ASCII");
//
String text = new String(payload, languageCodeLength + 1,
payload.length - languageCodeLength - 1, textEncoding);
return text;
} catch (Exception e) {
throw new IllegalArgumentException();
}
}
//初次判断是什么类型的NFC卡
public static NdefMessage[] getNdefMsg(Intent intent) {
if (intent == null)
return null;
//nfc卡支持的格式
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String[] temp = tag.getTechList();
for (String s : temp) {
Log.i(TAG, "resolveIntent tag: " + s);
}
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action) ||
NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ||
NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
Parcelable[] rawMessage = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage[] ndefMessages;
// 判断是哪种类型的数据 默认为NDEF格式
if (rawMessage != null) {
Log.i(TAG, "getNdefMsg: ndef格式 ");
ndefMessages = new NdefMessage[rawMessage.length];
for (int i = 0; i < rawMessage.length; i++) {
ndefMessages[i] = (NdefMessage) rawMessage[i];
}
} else {
//未知类型
Log.i(TAG, "getNdefMsg: 未知类型");
byte[] empty = new byte[0];
byte[] id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
Parcelable parcelable = intent
.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] payload = dumpTagData(parcelable).getBytes();
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN,
empty, id, payload);
NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
ndefMessages = new NdefMessage[]{msg};
}
return ndefMessages;
}
return null;
}
//一般公家卡,扫描的信息
private static String dumpTagData(Parcelable p) {
StringBuilder sb = new StringBuilder();
Tag tag = (Tag) p;
byte[] id = tag.getId();
sb.append("Tag ID (hex): ").append(getHex(id)).append("\n");
sb.append("Tag ID (dec): ").append(getDec(id)).append("\n");
sb.append("ID (reversed): ").append(getReversed(id)).append("\n");
String prefix = "android.nfc.tech.";
sb.append("Technologies: ");
for (String tech : tag.getTechList()) {
sb.append(tech.substring(prefix.length()));
sb.append(", ");
}
sb.delete(sb.length() - 2, sb.length());
for (String tech : tag.getTechList()) {
if (tech.equals(MifareClassic.class.getName())) {
sb.append('\n');
MifareClassic mifareTag = MifareClassic.get(tag);
String type = "Unknown";
switch (mifareTag.getType()) {
case MifareClassic.TYPE_CLASSIC:
type = "Classic";
break;
case MifareClassic.TYPE_PLUS:
type = "Plus";
break;
case MifareClassic.TYPE_PRO:
type = "Pro";
break;
}
sb.append("Mifare Classic type: ");
sb.append(type);
sb.append('\n');
sb.append("Mifare size: ");
sb.append(mifareTag.getSize() + " bytes");
sb.append('\n');
sb.append("Mifare sectors: ");
sb.append(mifareTag.getSectorCount());
sb.append('\n');
sb.append("Mifare blocks: ");
sb.append(mifareTag.getBlockCount());
}
if (tech.equals(MifareUltralight.class.getName())) {
sb.append('\n');
MifareUltralight mifareUlTag = MifareUltralight.get(tag);
String type = "Unknown";
switch (mifareUlTag.getType()) {
case MifareUltralight.TYPE_ULTRALIGHT:
type = "Ultralight";
break;
case MifareUltralight.TYPE_ULTRALIGHT_C:
type = "Ultralight C";
break;
}
sb.append("Mifare Ultralight type: ");
sb.append(type);
}
}
return sb.toString();
}
private static String getHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = bytes.length - 1; i >= 0; --i) {
int b = bytes[i] & 0xff;
if (b < 0x10)
sb.append('0');
sb.append(Integer.toHexString(b));
if (i > 0) {
sb.append(" ");
}
}
return sb.toString();
}
private static long getDec(byte[] bytes) {
long result = 0;
long factor = 1;
for (int i = 0; i < bytes.length; ++i) {
long value = bytes[i] & 0xffl;
result += value * factor;
factor *= 256l;
}
return result;
}
private static long getReversed(byte[] bytes) {
long result = 0;
long factor = 1;
for (int i = bytes.length - 1; i >= 0; --i) {
long value = bytes[i] & 0xffl;
result += value * factor;
factor *= 256l;
}
return result;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
NFCRead-master.zip (49个子文件)
NFCRead-master
gradlew.bat 2KB
gradlew 5KB
gradle.properties 726B
app
proguard-rules.pro 751B
src
test
java
com
example
chenqiuyang
nfcread
ExampleUnitTest.java 392B
androidTest
java
com
example
chenqiuyang
nfcread
ExampleInstrumentedTest.java 746B
main
res
mipmap-xxxhdpi
ic_launcher.png 9KB
ic_launcher_round.png 15KB
drawable
ic_launcher_background.xml 5KB
mipmap-hdpi
ic_launcher.png 3KB
ic_launcher_round.png 5KB
drawable-v24
ic_launcher_foreground.xml 2KB
values
colors.xml 208B
strings.xml 70B
styles.xml 383B
mipmap-xxhdpi
ic_launcher.png 6KB
ic_launcher_round.png 10KB
mipmap-mdpi
ic_launcher.png 2KB
ic_launcher_round.png 3KB
mipmap-xhdpi
ic_launcher.png 4KB
ic_launcher_round.png 7KB
mipmap-anydpi-v26
ic_launcher_round.xml 272B
ic_launcher.xml 272B
layout
activity_nfc.xml 1KB
activity_main.xml 743B
xml
nfc_tech_filter.xml 269B
java
com
example
chenqiuyang
nfcread
NfcActivity.java 4KB
read
SmartPoster.java 7KB
ParsedNdefRecord.java 803B
UriRecord.java 5KB
TextRecord.java 4KB
MainActivity.java 353B
NfcUtil.java 7KB
NdefMessageParser.java 3KB
AndroidManifest.xml 2KB
.gitignore 7B
build.gradle 1019B
gradle
wrapper
gradle-wrapper.jar 53KB
gradle-wrapper.properties 230B
.idea
caches
build_file_checksums.ser 543B
codeStyles
Project.xml 2KB
gradle.xml 626B
runConfigurations.xml 564B
misc.xml 2KB
vcs.xml 180B
kotlinc.xml 216B
.gitignore 137B
settings.gradle 15B
build.gradle 543B
共 49 条
- 1
资源评论
openopen_119
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功