NFC三种模式之读卡器模式
- 1.申请权限
- 2.过滤器的设置
- 3.接收卡片信息
- 仿真卡模式
NFC的工作模式
读卡器模式(Reader/writer mode)、仿真卡模式(Card Emulation Mode)、点对点模式(P2P mode)。
读卡器模式:读卡器模式本质上就是通过NFC设备(例如支持NFC的Android手机)从带有NFC芯片的标签、贴纸、报纸、明信片、名片等媒介读取信息,或将数据写到这些媒介中。
1.申请权限
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
2.过滤器的设置
过滤器的设置(三种模式):
第一种模式:优先级最高。先判断是不是NDEF_DISCOVERED格式的数据,再判断NDEF_DISCOVERED数据的类型,只有与过滤器中两个条件都要求的一致,才会选择满足的activity 来处理。
<intent-filter><action android:name="android.nfc.action.NDEF_DISCOVERED" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" />
</intent-filter>
第二种模式:优先级次于第一种模式。满足TECH_DISCOVERED的设置,才会选择满足的activity 来处理。
<activity ...>...<intent-filter><action android:name="android.nfc.action.TECH_DISCOVERED" /></intent-filter><meta-dataandroid:name="android.nfc.action.TECH_DISCOVERED"android:resource="@xml/nfc_tech_filter" />
</activity>
在res下新建xml文件夹然后新建一个nfc_tech_filter.xml文件,添加进你需要支持的标签类型。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><!-- 可以处理所有Android支持的NFC类型 --><tech-list><tech>android.nfc.tech.IsoDep</tech></tech-list><tech-list><tech>android.nfc.tech.NfcA</tech></tech-list><tech-list><tech>android.nfc.tech.NfcB</tech></tech-list><tech-list><tech>android.nfc.tech.NfcF</tech></tech-list><tech-list><tech>android.nfc.tech.NfcV</tech></tech-list><tech-list><tech>android.nfc.tech.Ndef</tech></tech-list><tech-list><tech>android.nfc.tech.NdefFormatable</tech></tech-list><tech-list><tech>android.nfc.tech.MifareUltralight</tech></tech-list><tech-list><tech>android.nfc.tech.MifareClassic</tech></tech-list>
</resources>
第三种模式:优先级最低。只要满足NFC规范中的任一种则都就会响应。
<intent-filter><action android:name="android.nfc.action.TAG_DISCOVERED" />
</intent-filter>
3.接收卡片信息
private NfcAdapter mNfcAdapter;@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);mNfcAdapter = NfcAdapter.getDefaultAdapter(getContext());}//支持的标签类型private final int flag = NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS| NfcAdapter.FLAG_READER_NFC_A| NfcAdapter.FLAG_READER_NFC_B| NfcAdapter.FLAG_READER_NFC_BARCODE| NfcAdapter.FLAG_READER_NFC_F| NfcAdapter.FLAG_READER_NFC_V;@Overridepublic void onResume() {super.onResume();mNfcAdapter.enableReaderMode(getActivity(), new NfcAdapter.ReaderCallback() {@Overridepublic void onTagDiscovered(Tag tag) {//TODO 这里处理标签信息}}, flag, null);}@Overridepublic void onPause() {super.onPause();mNfcAdapter.disableReaderMode(getActivity());}
各种标签解析见 Android NFC之标签解析
仿真卡模式
Android NFC之仿真卡模式