先看流程图
使用步骤:
第一步:声明权限
<!-- 允许应用程序使用NFC功能 --> <uses-permission android:name="android.permission.NFC" />
第二步:Activity设置能拦截的NFC tag,不需要拦截ACTION_NDEF_DISCOVERED类型的NDEF标签,标题说了拦截非NDEF的tag
<activity android:name="com.example.nfcdemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- 能拦截TECH_DISCOVERED的tag --> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <!-- TECH_DISCOVERED中哪些部分的tag,在xml文件中找 --> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> <!-- 能拦截ACTION_TAG_DISCOVERED,好像拦截了,也没啥用,又处理不了--> <intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
其中,nfc_tech_filter.xml在res的xml文件夹中(没有该文件夹则创建该文件夹)
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.IsoDep</tech> </tech-list> <!-- 以下只是显示怎么添加多个nfc支持类 --> <tech-list> <tech>android.nfc.tech.NfcV</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcF</tech> </tech-list> </resources>
第三步:在拦截的Aty中
private NfcAdapter nfcAdapter; // NFC适配器
// 获取默认的NFC控制器,并进行判断 nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { Log.d("h_bl", "设备不支持NFC!"); finish(); return; } if (!nfcAdapter.isEnabled()) { Toast.makeText(getApplicationContext(), "请在系统设置中先启用NFC功能!", Toast.LENGTH_SHORT).show(); Log.d("h_bl", "请在系统设置中先启用NFC功能!"); return; } Intent intent = this.getIntent(); // 捕获NFC Intent praseIntent(intent);
解析Intent
private void praseIntent(Intent intent) { String nfcAction = intent.getAction(); // 解析该Intent的Action if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(nfcAction)) { Log.d("h_bl", "ACTION_TECH_DISCOVERED"); Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // 获取Tag标签,既可以处理相关信息 for (String tech : tag.getTechList()) { Log.d("h_bl", "该tag支持的tech=" + tech); } IsoDep isoDep = IsoDep.get(tag); String str = ""; try { isoDep.connect(); // 连接 if (isoDep.isConnected()) { Log.d("h_bl", "isoDep.isConnected"); // 判断是否连接上 // 1.首先初始化的时候你要先读根目录3F00 byte[] ROOT_DIRECTORY={ (byte)0x00, (byte)0xA4, (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x3F, (byte)0x00, (byte)0x00 }; } } catch (IOException e) { e.printStackTrace(); } finally { if (isoDep != null) { try { isoDep.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
解析过程:
1.解析该Intent的Action
2.获取Tag标签,既可以处理相关信息
3.创建相关的类进行处理
4.详见IsoDep类的使用
还有一个前台调度系统,详见前台调度系统的使用。