Android NFC近場通信02----讀寫卡的準備工作
Android NFC近場通信02----讀寫卡的準備工作
因為公司接了一個聽上去感覺比較NB的項目。給某油田做派工系統 。並由小女子負責Androidclient的開發工作~~開發時的Android設備看上去是比較高大上哈,防爆的,事實上非常多次同事們都想開玩笑的說試試摔地上,都防爆嘛。那肯定摔不壞的哈~~開發過程中須要用到NFC技術。所以就在網上學習並整理了一下關於Android nfc相關的知識~好了,切入主題。本文寫讀寫卡前的準備工作:
ps:這一系列有部分為網上整理所得。感謝感謝~~當然還包括小女子的部分代碼~~~
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-permissionandroid: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來查詢該卡的一些具體信息和數據。
Android NFC近場通信02----讀寫卡的準備工作