NFC是一套短距離的無線通信,通常距離是4厘米或更短。NFC工作頻率是13.56M Hz,傳輸速率是106kbit/s 到848kbit/s. NFC總是在一個發起者和一個被動目標之間發生。發起者發出近場無線電波,這個近場可以給被動目標供電。這些被動的目標包括不需要電源的標簽,卡,也可以是有電源的設備。
與其他無線通信技術比較, 例如藍牙和WiFi, NFC提供更低貸款和距離,並且低成本,不需要供電,不需要實現匹配,整個通信過程僅僅是短短的靠近一秒就能完成。
一個帶有NFC支持的android設備通常是一個發起者。也可以作為NFC的讀寫設備。他將檢測NFC tags並且打開一個Activity來處理. Android 2.3.3還有支持有限的P2P。
Tags分很多種,其中簡單的只提供讀寫段,有的只能讀。復雜的tags可以支持一些運算,加密來控制對tags里數據段的讀寫。甚至一些tags上有簡單的操作系統,允許一些復雜的交互和可以執行一些代碼。
本文的代碼例子是基於API10的。
要在Android手機中使用NFC,必須在AndroidManifest.xml中如下配置:
<uses-feature android:name="android.hardware.nfc" android:required="true" /> <uses-permission android:name="android.permission.NFC" />
Tag發布系統
當android設備掃描到一個NFC tag,通用的行為是自動找最合適的Activity會處理這個tag Intent而不需要用戶來選擇哪個Activity來處理。因為設備掃描NFC tags是在很短的范圍和時間,如果讓用戶選擇的話,那就有可能需要移動設備,這樣將會打斷這個掃描過程。你應該開發你只處理需要處理的tags的Activity,以防止讓用戶選擇使用哪個Activity來處理的情況。Android提供兩個系統來幫助你正確的識別一個NFC tag是否是你的Activity想要處理的:Intent發布系統和前台Activity發布系統。
Intent發布系統檢查所有Activities的intent filters,找出那些定義了可以處理此tag的Activity,如果有多個Activity都配置了處理同一個tag Intent,那么將使用Activity選擇器來讓用戶選擇使用哪個Activity。用戶選擇之后,將使用選擇的Activity來處理此Intent.
前台發布系統允許一個Activity覆蓋掉Intent發布系統而首先處理此tag Intent,這要求你將要處理Tag Intent的Activity運行在前台,這樣當一個NFC tag被掃描到,系統先檢測前台的Activity是否支持處理此Intent,如果支持,即將此Intent傳給此Activity,如果不支持,則轉到Intent發布系統。
以前台前台發布系統為例,需要編寫如下代碼:
1. 定義變量
private NfcAdapter mAdapter; private String[][] techList; private IntentFilter[] intentFilters; private PendingIntent pendingIntent; private Tag tag;
2. 添加下列代碼到Activity的onCreate() 方法里:
//獲取nfc適配器 mAdapter = NfcAdapter.getDefaultAdapter(this); //定義程序可以兼容的nfc協議,例子為nfca和nfcv //在Intent filters里聲明你想要處理的Intent,一個tag被檢測到時先檢查前台發布系統, //如果前台Activity符合Intent filter的要求,那么前台的Activity的將處理此Intent。 //如果不符合,前台發布系統將Intent轉到Intent發布系統。如果指定了null的Intent filters, //當任意tag被檢測到時,你將收到TAG_DISCOVERED intent。因此請注意你應該只處理你想要的Intent。 techList = new String[][] { new String[] { android.nfc.tech.NfcV.class.getName() }, new String[] { android.nfc.tech.NfcA.class.getName() } }; intentFilters = new IntentFilter[] { new IntentFilter( NfcAdapter.ACTION_TECH_DISCOVERED), }; //創建一個 PendingIntent 對象, 這樣Android系統就能在一個tag被檢測到時定位到這個對象 pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
3. 在onNewIntent方法中:
public void onNewIntent(Intent intent) { tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); return; }
4. 在OnPause方法中:
@Override protected void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); }
4. 在OnResume方法中:
@Override protected void onResume() { super.onResume(); //使用前台發布系統 mAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, techList); } }
定義了這些方法以后,運行程序,在不鎖屏的情況下,使用NFCV或NFCA的NFC卡靠近的手機的時候OnNewIntent就會被觸發。Tag就可以被獲取到,可以使用獲取到的TAG來查詢該卡的一些詳細信息和數據。