FC代表近場通訊,其全方位的測量精度可以達到釐米。這項技術也促進了其它一些好玩的技術的成長,如把兩個手機碰到一起就可以啟動一個多人遊戲,把手機貼近NFC讀寫器就可以進行付款了。
在Android4.4之前,NFC支付過程需要通過藉助裝置上一個專有的安全部件(Secure Element,可以存在SIM卡中),使用本地儲存的方式,關聯裝置本身的某種支付方式。這樣的話其它的APP就很難通過NFC進行支付操作,因為這個過程是依靠部分硬體的,也就是Secure Element,現在的問題就是像Sprint通訊公司或者Verizon通訊公司的這個載體部件,應該讓APP可以使用這個硬體功能。
基於主機的卡模擬技術
基於主機的卡模擬(HCE)是Android4.4的一項新技術,可以讓app繞過Secure Element,然後使用雲端支付資訊或者其它方式儲存的支付資訊來模擬一個NFC卡。有了HCE,任何APP都可以模擬一個NFC卡,而且任意一臺Android裝置可以當做NFC讀寫器。
檢測HCE功能就需要看看 FEATURE_NFC_HOST_CARD_EMULATION。
1 2 3 |
; html-script: false ] PackageManager pm = context.getPackageManager(); boolean hasNfcHce = pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION); |
需要在AndroidManifest.xml中宣告應用程式需要使用HCE功能:
1 2 3 |
; html-script: false ] <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc.hce" ... /> |
HCE需要實現為一個服務(service),Android中的服務可以執行在後臺,啟動後不用和使用者進行互動。此服務可以讓NFC在使用時不需要使用者首先開啟APP。在Android4.4中新增了 HostApduService,繼承它然後建立一個服務來處理近場通訊:
1 2 3 4 5 6 7 8 |
; html-script: false ] public class NfcHceService extends HostApduService { @Override public byte[] processCommandApdu(byte[] apdu, Bundle extras) { … } @Override public void onDeactivated(int reason) { … } } |
這個NfcHceService需要覆蓋兩個方法:processCommandApdu()和onDeactivated()。APDU(Application Protocol Data Unit)是NFC讀寫器傳送給NfcHceService的資料單元,然後processCommandApdu()方法回送一個響應APDU。在NFC讀寫器和另外一個HCE服務通訊或者裝置不在NFC讀寫器的範圍內時,onDeactivated()方法會被呼叫。
注意還要在AndroidManifest.xml中宣告服務:
1 2 3 4 5 6 7 8 9 10 |
; html-script: false ] <service android:name=".NfcHceService" android:exported="true" android:permission="android.permission.BIND_NFC_SERVICE"> <intent-filter> <action android:name="android.nfc.cardemulation.HOST_APDU_SERVICE" /> </intent-filter> <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/hceService" /> </service> |
這個hceService.xml資原始檔在meta-data標籤裡宣告,告訴Android系統到哪裡去尋找Application的ID組。
Application ID
Application ID (AID)可以讓NFC讀寫器識別出裝置需要讀哪一張模擬卡(在processCommandApdu()方法中需要得到一個響應)。AID是由ISO/IEC 7816-5(International Organization for Standardization and the International Electrotechnical Commission)制定的,Android裝置要想作為NFC讀寫器,必須註冊一個AID。
這裡在hceService.xml中定義了一個application的AID組,在此場景中,它就是一個用於支付的組(使用CardEmulation.CATEGORY而不是用其它的組CATEGORY_OTHER)。在這個支付組的AID的應用程式還需要有一個260*96dp的資源,為apduServiceBanner服務。
1 2 3 4 5 6 7 8 9 10 11 |
; html-script: false ] <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/my_app_hce_service" android:requireDeviceUnlock="false" android:apduServiceBanner="@drawable/my_app_service_banner"> <aid-group android:description="@string/my_app_aid_group" android:category="payment"> <aid-filter android:name="4111111111111111"/> <aid-filter android:name="0123456789ABCDEF"/> </aid-group> </host-apdu-service> |
HCE簡化了開啟NFC功能,把它從載體部件中解脫出來(不用依賴Secure Element的載體了),解除了其它的裝置等相關的限制。
想要了解更多關於給予主機的卡模擬技術可以看看這裡 Host-based Card Emulation
本文是KitKat Developer’s Guide的第六篇,請持續關注更新或者在 twitter上關注我們