1. 程式人生 > >Android NFC近場通信02----讀寫卡的準備工作

Android NFC近場通信02----讀寫卡的準備工作

是否 即將 oid win wrap img pac 適配器 style

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-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來查詢該卡的一些具體信息和數據。

Android NFC近場通信02----讀寫卡的準備工作