AndroidNFC tag TNF TNFABSOLUTEURI TypeURI TNFEMPTY Android ACTIONTECHDISCOVERED
Android處理NFC tag資料的方式 TNF的設定值 說明 TNF_ABSOLUTE_URI Type欄位是URI資料 TNF_EMPTY Android系統會以 ACTION_TECH_DISCOVERED的方 式處理 TNF_EXTERNAL_TYPE Type欄位是URN 型態的URI,Android會將它的格 式轉成 vnd. android. nfc: //ext/<domain_name>: <servi ce_name> TNF_MIME_MEDIA Type欄位是描述MIME的型態 TNF_UNCHANGED Android系統會以 ACTION_TECH_DISCOVERED的方 式處理 TNF_UNKNOWN Android系統會以 ACTION_TECH_DISCOVERED的方 式處理 TNF_WELL_KNOWN Type欄位是RTD 7
Android處理NFC tag資料的方式 Type欄位的值(RTD) 說明 RTD_ALTERNATIVE_CARRIER Android系統會以 ACTION_TECH_DISCOVERED的方式處理 RTD_HANDOVER_REQUEST Android系統會以 ACTION_TECH_DISCOVERED的方式處理 RTD_HANDOVER_SELECT Android系統會以 ACTION_TECH_DISCOVERED的方式處理 RTD_SMART_POSTER Payload欄位是URI RTD_TEXT MIME型態是text/plain. RTD_URI Payload欄位是URI 8
Android處理NFC tag資料的方式 例如NFC message中的第一個record的TNF是 TNF_ABSOLUTE_URI,則表示Type欄位就是URI, 此時Android會取出該URI連同Payload中的資料一 起包裝成一個ACTION_NDEF_DISCOVERED型態 的Intent物件。 如果NFC message的第一個record的TNF是 TNF_UNKNOWN,則Android會建立一個 ACTION_TECH_DISCOVERED型態的Intent物件。 當Android根據NFC tag中的資料建立好Intent物件後, 便開始搜尋可以處理該Intent的程式,並根據下列 步驟進行後續操作。 10
Android處理NFC tag資料的方式 12
開發NFC程式 要讓程式能夠處理NFC tag的資料必須先在程式功能描述檔 Android. Manifest. xml中完成以下設定: <? xml version="1. 0" encoding="utf-8"? > <manifest. . . >. . . <uses-sdk android: min. Sdk. Version="10" /> <uses-permission android: name="android. permission. NFC" /> <uses-feature android: name="android. hardware. nfc" android: required="true" /> <application. . . > … </application> </manifest> 13
開發NFC程式 接下來是設定程式能夠處理的NFC Intent的形式,這其實是 利用單元四十介紹的Intent Filter技術。例如要讓程式能夠處 理ACTION_NDEF_DISCOVERED型態的Intent,而且資料 是屬於MIME的text形式,就必須在程式功能描述檔中加入 以下設定: <? xml version="1. 0" encoding="utf-8"? > <manifest …> … <application …> <activity …> <intent-filter> <action android: name="android. nfc. action. NDEF_DISCOVERED"/> <category android: name="android. intent. category. DEFAULT"/> <data android: mime. Type="text/plain" /> </intent-filter> </activity> </application> </manifest> 14
開發NFC程式 如果程式要處理的資料是屬於URI型態,而且內容 是http: //developer. android. com/index. html,就必須設 定為: …(同前一個範例) <intent-filter> <action android: name="android. nfc. action. NDEF_DISCOVERED"/> <category android: name="android. intent. category. DEFAULT"/> <data android: scheme="http" android: host="developer. android. com" android: path. Prefix="/index. html" /> </intent-filter> …(同前一個範例) 15
開發NFC程式 如果要讓程式能夠處理ACTION_TECH_DISCOVERED型態 的Intent,必須先在程式專案的res資料夾中新增一個xml子 資料夾,並且在裡頭建立一個xml檔,例如可以將它取名為 nfc_tech_list. xml,然後編輯它的內容如下: <resources xmlns: xliff="urn: oasis: names: tc: xliff: document: 1. 2"> <tech-list> <tech>android. nfc. tech. Nfc. A</tech> <tech>android. nfc. tech. Ndef</tech> </tech-list> <tech>android. nfc. tech. Nfc. B</tech> <tech>android. nfc. tech. Ndef</tech> </tech-list> </resources> 這個檔案定義程式能夠處理的NFC tag形式,以這個範例而 言表示程式能夠處理Nfc. A搭配Ndef的形式,或者是Nfc. B搭 配Ndef的形式。 16
開發NFC程式 然後在程式功能描述檔中加入下列設定: <? xml version="1. 0" encoding="utf-8"? > <manifest …> … <application …> <activity>. . . <intent-filter> <action android: name="android. nfc. action. TECH_DISCOVERED"/> </intent-filter> <meta-data android: name="android. nfc. action. TECH_DISCOVERED" android: resource="@xml/nfc_tech_list" />. . . </activity> </application> </manifest> 17
開發NFC程式 以下程式碼範例先檢查接收到的NFC Intent是否為 ACTION_NDEF_DISCOVERED型態,如果是的話再從中取 出EXTRA_NDEF_MESSAGES形式的資料: public void on. Resume() { super. on. Resume(); . . . if (Nfc. Adapter. ACTION_NDEF_DISCOVERED. equals(get. Intent(). get. Action())) { Parcelable[] raw. Msgs = intent. get. Parcelable. Array. Extra(Nfc. Adapter. EXTRA_NDEF_MESSAGES); if (raw. Msgs != null) { msgs = new Ndef. Message[raw. Msgs. length]; for (int i = 0; i < raw. Msgs. length; i++) { msgs[i] = (Ndef. Message) raw. Msgs[i]; } } } //處理msgs[]陣列中的資料 … 19 }
- Slides: 19