package com.mfh.comna.utils.nfc; import android.app.Activity; import android.content.Intent; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.MifareClassic; import android.os.Bundle; import android.util.Log; import android.widget.Toast; /** * Android设备检测到一个Tag时,会创建一个Tag对象,将其放在Intent对象,然后发送到此Activity * @author yxm * @version 1.0 */ public class NfcActivity extends Activity { private String Token;//Intent对象经处理后获取的特定标记 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //processIntent(this.getIntent());//调用处理Intent对象的方法 Token = getToken(this.getIntent()); if (Token != null){ //发送广播 Intent intent = new Intent(); intent.putExtra("Token", Token); intent.setAction("com.mfh.nfc.NFC_BROADCAST"); sendBroadcast(intent); } //结束Activity。因为只有Activity可以接收包含Tag的Intent对象, //故通过使NfcActivity快速消失以达到近似隐藏运行的效果,以增强用户体验。 finish(); } /** * 字符序列转换为16进制字符串 * @param src 字符序列 * @return */ private String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder("0x"); if (src == null || src.length <= 0) { return null; } char[] buffer = new char[2]; for (int i = 0; i < src.length; i++) { buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16); buffer[1] = Character.forDigit(src[i] & 0x0F, 16); stringBuilder.append(buffer); } return stringBuilder.toString(); } /** * 从Intent对象中解析 NDEF 消息(NFC Data Exchange Format,即 NFC 数据交换格式, * NDEF Message 为 NFC forum 定义的数据格式) * @param intent 包含Tag的Intent对象 */ private void processIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//取出封装在intent中的TAG boolean auth = false; //读取TAG MifareClassic mfc = MifareClassic.get(tagFromIntent); try { String metaInfo = ""; //从这个TagTechnology对象对tag启用I/O操作 mfc.connect(); //使用键值A鉴定扇区 int j = 0;//需要获取的Token信息位于扇区0 auth = mfc.authenticateSectorWithKeyA(j, MifareClassic.KEY_DEFAULT); int bIndex; if (auth) { // 读取扇区中的块 bIndex = mfc.sectorToBlock(j); byte[] data = mfc.readBlock(bIndex); metaInfo += bytesToHexString(data); metaInfo = metaInfo.substring(8, 10) + metaInfo.substring(6, 8) + metaInfo.substring(4, 6) + metaInfo.substring(2, 4); metaInfo = String.valueOf(Integer.parseInt(metaInfo, 16)); } else { metaInfo += "Sector " + j + ":验证失败\n"; } Token = metaInfo; } catch (Exception e) { e.printStackTrace(); } } /** * 获取UID * @param intent 扫描到的NFC的Intent对象 * @return */ private String getToken(Intent intent){ byte[] bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); String uid = bytesToHexString(bytesId); uid = uid.substring(8, 10) + uid.substring(6, 8) + uid.substring(4, 6) + uid.substring(2, 4); uid = String.valueOf(Long.parseLong(uid, 16)); return uid; } }