NFC NDEF NFC Data Exchange Format NDEF devicesdevicetag

  • Slides: 11
Download presentation

NFC簡介 支持NDEF NFC Data Exchange Format (NDEF) 格式為主,它支持devices之間或device與tag之間 互相交換小型資料,是屬於近距離的無線技術。 主要偵測到的三種格式 ACTION_NDEF_DISCOVERED ACTION_TECH_DISCOVERED ACTION_TAG_DISCOVERED 這次教學使用的是Mifare

NFC簡介 支持NDEF NFC Data Exchange Format (NDEF) 格式為主,它支持devices之間或device與tag之間 互相交換小型資料,是屬於近距離的無線技術。 主要偵測到的三種格式 ACTION_NDEF_DISCOVERED ACTION_TECH_DISCOVERED ACTION_TAG_DISCOVERED 這次教學使用的是Mifare Tag 屬於ACTION_TECH_DISCOVERED

NFC所需設定(一) 給予權限 <uses-permission android: name="android. permission. NFC"/> 指定最低的SDK版本 <uses-sdk android: min. Sdk. Version="10"/> (Android

NFC所需設定(一) 給予權限 <uses-permission android: name="android. permission. NFC"/> 指定最低的SDK版本 <uses-sdk android: min. Sdk. Version="10"/> (Android 2. 3. 3 (API Level 10)才有支援完整的NFC功能) 指定程式必需具有NFC晶片 <uses-feature android: name="android. hardware. nfc" android: required="true" />

NFC所需設定(二) 讀取 ACTION_TECH_DISCOVERED 格式 如果要讀取 ACTION_TECH_DISCOVERED 格式,需要在專案中增加一個新的 XML檔案,定義該應用程式支持的 tech-list sets。 <intent-filter> <action android: name="android.

NFC所需設定(二) 讀取 ACTION_TECH_DISCOVERED 格式 如果要讀取 ACTION_TECH_DISCOVERED 格式,需要在專案中增加一個新的 XML檔案,定義該應用程式支持的 tech-list sets。 <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" /> 這邊指定xml/nfc為需要讀取的檔案,所以我們要在專案中新增xml 目錄並且在底下新增名為nfc的xml <resources xmlns: xliff="urn: oasis: names: tc: xliff: document: 1. 2"> <!-- capture anything using Nfc. F --> <tech-list> <tech>android. nfc. tech. Iso. Dep</tech> <tech>android. nfc. tech. Nfc. A</tech> <tech>android. nfc. tech. Nfc. B</tech> <tech>android. nfc. tech. Nfc. F</tech> <tech>android. nfc. tech. Nfc. V</tech> <tech>android. nfc. tech. Ndef. Formatable</tech> <tech>android. nfc. tech. Mifare. Classic</tech> <tech>android. nfc. tech. Mifare. Ultralight</tech> </tech-list> </resources>

偵測卡片(一) 讓應用程式的Activity負責處理所有接受到的NFC intents 宣告 Pending. Intent m. Pending. Intent; Mifare. Classic mfc; Intent intent;

偵測卡片(一) 讓應用程式的Activity負責處理所有接受到的NFC intents 宣告 Pending. Intent m. Pending. Intent; Mifare. Classic mfc; Intent intent; Nfc. Adapter m. Adapter; Intent. Filter ndef; Intent. Filter[] m. Filters; String[][] m. Tech. Lists; String tag_id, tag_msg, tag_data; 讓Activity負責處理所有接收到的NFC Intents。 m. Adapter = Nfc. Adapter. get. Default. Adapter(this); m. Pending. Intent = Pending. Intent. get. Activity(this, 0, new Intent(this, get. Class()). add. Flags(Intent. FLAG_ACTIVITY_SINGLE_TOP), 0); //new. . 指定該Activity為應用程式中的最上層Activity↑ ndef = new Intent. Filter(Nfc. Adapter. ACTION_NDEF_DISCOVERED); try { ndef. add. Data. Type("*/*"); } catch (Intent. Filter. Malformed. Mime. Type. Exception e) { throw new Runtime. Exception("fail", e); } m. Filters = new Intent. Filter[]{ndef, }; m. Tech. Lists = new String[][]{new String[]{Mifare. Classic. class. get. Name()}};

偵測卡片(二) 處理由系統送來的intent @Override public void on. New. Intent(Intent intent) { msg. set. Text("NFC有反應喔喔"); }

偵測卡片(二) 處理由系統送來的intent @Override public void on. New. Intent(Intent intent) { msg. set. Text("NFC有反應喔喔"); } @Override protected void on. Resume() { super. on. Resume(); m. Adapter. enable. Foreground. Dispatch(this, m. Pending. Intent, m. Filters, m. Tech. Lists); }

Mifare TAG讀取表頭 在on. New. Intent底下新增 String action = intent. get. Action(); if (Nfc. Adapter.

Mifare TAG讀取表頭 在on. New. Intent底下新增 String action = intent. get. Action(); if (Nfc. Adapter. ACTION_TECH_DISCOVERED. equals(action)) { Tag tag. From. Intent = intent. get. Parcelable. Extra(Nfc. Adapter. EXTRA_TAG); mfc = Mifare. Classic. get(tag. From. Intent); boolean auth = false; tag_data = ""; try{ mfc. connect(); tag. From. Intent = mfc. get. Tag(); auth = mfc. authenticate. Sector. With. Key. A(0, Mifare. Classic. KEY_DEFAULT); if (!auth) tag_data = "無法讀取"; tag_id = output(tag. From. Intent. get. Id()); msg. set. Text("Tag. Id: " + tag_id); } catch (IOException e) { msg. set. Text("No Get Tech: n" + e); } } else msg. set. Text("本程式不支援此種類卡");

處理Byte public String output(byte[] data){ String out=""; for(int i=0; i<data. length; i++) out =

處理Byte public String output(byte[] data){ String out=""; for(int i=0; i<data. length; i++) out = out +data[i]; return out; }

Mifare TAG 讀取Block tag_data = new String(mfc. read. Block(1), Charset. for. Name("UTF-8")); msg. set.

Mifare TAG 讀取Block tag_data = new String(mfc. read. Block(1), Charset. for. Name("UTF-8")); msg. set. Text("Tag. Id: " + tag_id + "n Block: " + tag_data);

Mifare TAG 寫入Block 宣告int nfc_s = 0; 控制寫入或讀取 做兩個按鈕控制nfc_s變數(0為讀取,1為寫入) 寫入程式碼 if (!auth) tag_data =

Mifare TAG 寫入Block 宣告int nfc_s = 0; 控制寫入或讀取 做兩個按鈕控制nfc_s變數(0為讀取,1為寫入) 寫入程式碼 if (!auth) tag_data = "無法寫入"; else{ byte[] value = getmsg. get. Text(). to. String(). trim(). get. Bytes("UTF-8"); byte[] to. Write = new byte[Mifare. Classic. BLOCK_SIZE]; for (int i = 0; i < Mifare. Classic. BLOCK_SIZE; i++) { if (i < value. length) to. Write[i] = value[i]; else to. Write[i] = 0; } mfc. write. Block(1, to. Write); } mfc. close(); msg. set. Text("寫進去囉!!嘿嘿");