NFC (一)概述


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

 

下一篇  NFC (二)讀寫MifareClassic協議的NFC卡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM