本文共 3820 字,大约阅读时间需要 12 分钟。
NFC读取写入简单使用
适用于无加密普通NFC卡片数据读取写入NFC数据读取写入的方法
Demo地址:/** * 读取NFC数据 */public static String readNfcData(Intent intent) { String text = ""; if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage msgs[] = null; if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } try { if (msgs != null) { NdefRecord record = msgs[0].getRecords()[0]; text = parseTextRecord(record); } } catch (Exception e) { e.printStackTrace(); } } return text; }/***写入NFC数据*/public static boolean writeNfc(NdefMessage ndefMessage, Tag tag) { try { Ndef ndef = Ndef.get(tag); if (ndef != null) { ndef.connect(); boolean isWritable = ndef.isWritable(); int maxSize = ndef.getMaxSize(); int msgLength = ndefMessage.toByteArray().length; if (!isWritable || maxSize < msgLength) { return false; } ndef.writeNdefMessage(ndefMessage); ndef.close(); } else { NdefFormatable formatable = NdefFormatable.get(tag); if (formatable != null) { formatable.connect(); formatable.format(ndefMessage); formatable.close(); } } return true; } catch (Exception e) { e.printStackTrace(); } return false; }public static NdefRecord createTextRecord(String text) { byte[] langBytes = Locale.CHINA.getLanguage().getBytes(Charset.forName("US-ASCII")); Charset utfEncoding = Charset.forName("UTF-8"); byte[] textBytes = text.getBytes(utfEncoding); int utfBit = 0; char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length]; data[0] = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); NdefRecord ndefRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_TEXT, new byte[0], data); return ndefRecord; }public static String parseTextRecord(NdefRecord ndefRecord) { //判断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(); //下面开始NDEF文本数据第一个字节,状态字节 //判断文本是基于UTF-8还是UTF-16的,取第一个字节"位与"上16进制的80,16进制的80也就是最高位是1, //其他位都是0,所以进行"位与"运算后就会保留最高位 String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8" : "UTF-16"; //3f最高两位是0,第六位是1,所以进行"位与"运算后获得第六位 int languageCodeLength = payload[0] & 0x3f; //下面开始NDEF文本数据第二个字节,语言编码 //获得语言编码 String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); //下面开始NDEF文本数据后面的字节,解析出文本 String textRecord = new String(payload, languageCodeLength + 1,payload.length - languageCodeLength - 1,textEncoding); return textRecord; } catch (Exception e) { throw new IllegalArgumentException(); } }
转载地址:http://disvi.baihongyu.com/