android nfc application development environment setup

45
Android NFC 開發環境安裝 Android NFC Application Development Environment Setup Chun-Kai Wang (王雋凱) IDSL - Dept. of IM - NTUST

Upload: chun-kai-wang

Post on 20-Aug-2015

1.164 views

Category:

Technology


6 download

TRANSCRIPT

Android NFC 開發環境安裝Android NFC Application Development Environment Setup

Chun-Kai Wang (王雋凱)

IDSL - Dept. of IM - NTUST

Overview

▪ Preparing Android Development Environment

▪ Installing Open NFC for Android edition

▪ Android NFC Basics

▪ Coding Hello NFC Application

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

準備 Android 開發環境

Android 開發環境

▪ JDK (Java Development Kit)▪ Java 開發套件;Android Developers 官方建議使用 JDK 6。

▪ Android SDK▪ Android軟體開發套件。

▪ Eclipse▪ 跨平台整合式開發環境(IDE)。

▪ ADT Plugin for Eclipse▪ Eclipse IDE的 Android開發工具套件。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

Android 4.0 之後,Google將 Android SDK、Eclipse、ADT Plugin for Eclipse 整合至 ADT Bundle ,簡化Android 開發環境的安裝步驟。

安裝 JDK▪ http://www.oracle.com/technetwork/java/javase/downloads/index.html

▪ JDK當前版本為 JDK 8,與 Android Developers 官方建議版本不同(JDK 6)。可前往下列網址下載 JDK 6版本:

▪ http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

下載 ADT Bundle▪ http://developer.android.com/sdk/index.html

▪ ADT Bundle 整合 Android 開發必備工具,下載解壓縮後即可使用。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

安裝 Open NFC

下載 Open NFC Android Edition▪ http://open-nfc.org/wp/home/downloads/

▪ 選擇 4.4.1 Android Edition (SDK) 版,此為穩定版本並整合 Android SDK。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

安裝 Open NFC▪ 將下載完成的 ADT Bundle 解壓縮,開啟 SDK Manager.exe。

▪ 配合 Open NFC for Android版本,點選 Android 4.0.3 (API15) 進行安裝程序。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

安裝 Open NFC (Cont.)

▪ 將 Open NFC SDK for Android v4.4.1解壓縮,複製 OpenNFC_AddOn資料夾內的檔案至 ADT Bundle目錄下的 add-ons資料夾內。

▪ 重新開啟 SDK Manager.exe,如下圖表示已安裝完成。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

創建 NFC模擬器▪ 開啟 eclipse.exe,點選下列圖示開啟 Android Virtual Device

(AVD) Manager。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

創建 NFC模擬器 (Cont.)

▪ 開啟 AVD後點選 Create,進行模擬器設定。

▪ 如右圖所示,確認 Target 為OpenNFC 4.4.1後,點選 OK。

▪ 返回 AVD Manager,選擇剛剛創建的模擬器,點選 Start即可啟動模擬器。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

設定 NFC模擬器▪ 啟動模擬器後,在 Apps找到 Settings Open NFC。

▪ 選取 NFC Controller simulator。

▪ 輸入 IP Address 後勾選Enabled/disabled NFC。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

設定 Connection Center▪ 在 Open NFC SDK for Android v4.4.1 目錄下找到 connection_center資料夾,開啟 Connection Center.exe,勾選以下項目。

▪ 重新開啟 Connection Center.exe,確認設定已儲存。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

測試應用程式1. 開啟 Connection Center

▪ Open NFC SDK for Android v4.4.1 (13751)/android_sdk/connection_center/Connection Center.exe

2. 開啟 NfcSimulator

▪ Open NFC SDK for Android v4.4.1 (13751)/android_sdk/nfcc_simulator/NfcSimulator.exe

3. 啟動 NFCDevice模擬器

▪ 確認模擬器已完成 Open NFC 設定

4. 執行應用程式

▪ 請注意開啟順序不同可能造成NFC功能無法正常運作。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

Android NFC 開發基礎

What is NFC?

▪ Near Field Communication▪ 以 RFID為基礎,是一種短距離非接觸式的通訊方式。

▪ 作用於 13.56MHz頻帶,傳輸距離約 10 cm。

▪ NFC vs. RFID▪ NFC是 RFID技術中一個專門的子集,可視為高頻(HF)

RFID技術的分支,工作在 13.56MHz頻帶。

▪ NFC裝置能夠同時具有 NFC讀取器和 NFC標籤,此種特性允許 NFC做點對點(peer-to-peer)的傳輸。

▪ NFC 是一種近距離的私密通訊方式,安全性比 RFID更高。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NFC Modes▪ 讀寫模式 (Reader/Writer Mode)

▪ NFC裝置具備非接觸式讀取器,可讀寫外部非接觸式卡片資訊。

▪ 點對點模式 (P2P Mode)

▪ NFC裝置可和其他 NFC 裝置進行資料交換。

▪ 卡片模擬模式 (Card Emulation Mode)

▪ NFC裝置可模擬成一張非接觸式卡片,與讀卡機進行互動。

▪ Android Support

▪ Tag Reading – since Android 2.3 (API 9)

▪ Tag Writing – since Android 2.3.3 (API 10)

▪ Beam (P2P) – Since Android ICS 4.0 (API 14)

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NFC on Android

▪ When NFC can work in Android?▪ 在 Android 裝置設定中啟用 NFC功能。

▪ Android 裝置螢幕未被鎖定。

▪ The Tag Dispatch System▪ 當 Android 裝置發現一個 NFC Tag,最好的作法是自動啟動對應的應用程式,而不是詢問使用者選擇。

-因為選擇的動作可能會讓使用者必須將裝置離開 Tag。

▪ 因此 Android 提供 Tag Dispatch System 協助處理:

▪ 解析出 NFC tag 且找出MIME type 或 URI 來確定 Tag 裡的資料。

▪ 將MIME type 或 URI,和資料一起封裝進一個 Intent object。

▪ 基於建立好的 Intent object 來啟動 Activity。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NFC Tag Dispatch System▪ Tag Dispatch系統定義三種 intents,其優先權由高而低為:

▪ ACTION_NDEF_DISCOVERED

▪ 當 tag內容包括一個 NDEF payload與具有可識別的類型被掃瞄到,該 intent被用來啟動一個 Activity。

▪ ACTION_TECH_DISCOVERED

▪ 如果沒有 activities 註冊處理 ACTION_NDEF_DISCOVERED該 intent,tag dispatch system 會發啟一個 ACTION_TECH_DISCOVER的 intent給對應的應用程式進行處理。

▪ ACTION_TAG_DISCOVERED

▪ 如果沒有 activities 註冊處理 ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED的 intents,將會發啟該 intent。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NFC Tag Dispatch System (Cont.)

▪ 基本的 Tag Dispatch System處理流程如下圖:

▪ Android NFC 應用程式開發是使用 Intents 與 Intent Filters機制處理裝置偵測到的 tag。關於 Intents 與 Intent Filters的詳細說明,請參閱 Android Developers 官方文件:

▪ http://developer.android.com/guide/components/intents-filters.html

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

How to use Android NFC API?

▪設定 Android Manifest▪ 宣告存取 NFC硬體許可權

▪ 宣告支援最低的 SDK版本

▪ 指定 Android 裝置須配備 NFC功能才可安裝 ( for Google Play)

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

<uses-permission android:name="android.permission.NFC" />

<uses-sdk android:minSdkVersion="10" />

<uses-feature android:name="android.hardware.nfc" android:required="true" />

NFC API Overview▪ android.nfc套件 (Package) 主要提供了 NFC裝置對 NFC Tag 讀寫 NDEF 訊息的操作,以及兩個 NFC 裝置之間的資料交換的功能函式。

▪ 詳細的 API操作方式,可參考 Android Developers 官方文件:

▪ http://developer.android.com/guide/topics/connectivity/nfc/

▪ http://developer.android.com/reference/android/nfc/package-summary.html

Class Description

NdefMessage Represents an immutable NDEF Message.

NdefRecord Represents an immutable NDEF Record.

NfcAdapter Represents the local NFC adapter.

NfcEvent Wraps information associated with any NFC event.

NfcManager High level manager used to obtain an instance of an NfcAdapter.

Tag Represents an NFC tag that has been discovered.

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NfcAdapter▪ NfcAdapter是定義在 android.nfc套件中的類別。

▪ 判斷目前裝置是否支持或啟動 NFC功能,可透過以下方法 (method):

▪ public static NfcAdapter getDefaultAdapter (Context context)

▪ 取得預設的 NFC介面卡。

▪ 回傳 null 代表該裝置不支援 NFC。

▪ public boolean isEnabled ()

▪ 判斷目前裝置 NFC 功能是否啟動。

▪ 回傳 true 代表 NFC功能已啟動;回傳 false 代表 NFC功能尚未啟動。

▪ public Boolean isNdefPushEnabled()

▪ 判斷目前裝置 Beam 功能是否啟動。

▪ 回傳 true 代表 Beam功能已啟動;回傳 false 代表 Beam功能尚未啟動。

▪ 用於 P2P開發模式。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

Foreground Dispatch System▪ Foreground Dispatch System是一種用於在執行的程式 (前台呈現的Activity)中處理 NFC tag 的方法。

▪ 允許 Activity 攔截 Intent 物件,並且宣告該 Activity 的優先順序比其他處理 Intent 物件的 Activity 高。

▪ 使用說明:

1. 在 Activity 的 onCreate() 方法中增加下列程式:

▪ 建立一個 PendingIntent物件,以便 Android 系統能夠在掃描到 NFC tag 時,用它來封裝 NFC tag 的詳細資訊。

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass())

.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

Foreground Dispatch System (Cont.)

▪ 使用 Intent Filter 來處理想要截獲的 Intent 物件。

▪ 可宣告一個 tag technologies陣列來處理支援的 NFC tag。

techListsArray = new String[][] { new String[] { NfcF.class.getName() } };

IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);try {

ndef.addDataType("*/*"); /* Handles all MIME based dispatches.You should specify only the onesthat you need. */

}catch (MalformedMimeTypeException e) {

throw new RuntimeException("fail", e);}intentFiltersArray = new IntentFilter[] {ndef, };

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

2. 覆寫 Activity 生命週期的方法 (method),以決定啟用 Foreground Dispatch System 的時機,並在 onNewIntent() 內處理掃描的 Tag 物件。

▪ 關於 Activity 生命週期的介紹,可參考:

▪ http://developer.android.com/guide/components/activities.html

public void onPause() {super.onPause();mAdapter.disableForegroundDispatch(this);

}

public void onResume() {super.onResume();mAdapter.enableForegroundDispatch(this, pendingIntent,

intentFiltersArray, techListsArray);}

public void onNewIntent(Intent intent) {Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);// do something with tagFromIntent

}

Foreground Dispatch System (Cont.)

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

Hello NFC!

新增 Android Application 專案▪ File → New → Android Application Project

▪ Android在 API 9開始引入 NFC功能,不過於 API 10才有較好的支援,因此我們在Minimum Required SDK 選單下選擇 API 10。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

Android 應用程式結構▪ src:原始檔案目錄

▪ gen:索引檔案目錄

▪ assets:資源檔目錄

▪ bin:可執行檔目錄

▪ libs:第三方 JAR檔案

▪ res:資源檔目錄

▪ AndroidManifest.xml:定義整個應用程式的框架

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

設定 AndroidManifest▪ 新建專案後,打開 AndroidManifest.xml,加入以下片段:

▪ 紅色框選部分代表 App 最低要求的手機系統版本為 API 10+ (Android 2.3.3)以及獲取 NFC硬體的操作權限,並且是配備 NFC功能的手機。

▪ 藍色框選部分代表如果日後要將 App 上傳至 Google Play,使用者必須是支持 NFC功能的裝置才可以安裝此應用程式。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

設置佈局▪ 新建專案時,預設新增MainActivity,此為 App 啟動的第一個 Activity,應會在 res/layout目錄下找到對應的 activity_main.xml,將其修改佈局如下:

▪ 此 Layout 定義了一個 RelativeLayout (相對佈局),可以讓子視圖根據它的父視圖或其他視圖指定本身的相對位置。

▪ 在 RelativeLayout 底下我們配置一個用以顯示文字的 TextView元件,並且設置為垂直水平置中。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

加入字串清單▪ 在 res/values 目錄下找到 strings.xml,加入以下字串清單。

▪ app_name:應用程式名稱。

▪ nfc_unsupported:Android裝置不支援 NFC功能時,所顯示的文字訊息。

▪ nfc_disabled:Android裝置尚未開啟 NFC功能時,所顯示的文字訊息。

▪ nfc_ready:NFC功能已準備就緒時,所顯示的文字訊息。

▪ hello_nfc:當 Android 裝置偵測到 Tag 時,所顯示的NFC訊息。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

新增 NfcActity類別

▪ 在 src目錄下的 package點擊右鍵→ New → Class

▪ Name: NfcActivity

▪ Modifiers: public, abstract

▪ Superclass:android.app.Activity

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NfcActivity說明▪ NfcActivity是自定義的抽象類別,繼承於 android.app.Activity。

▪ NfcActivity包含 Foreground Dispatch System,以及操作 NFC的方法(method)。我們所定義的抽象方法說明如下:

▪ protected abstract void onNfcFeatureNotFound();

▪ 當 Android裝置不支持 NFC功能時,呼叫該方法。

▪ protected abstract void onNfcStateEnabled();

▪ 當 Android裝置 NFC 功能已啟動時,呼叫該方法。

▪ protected abstract void onNfcStateDisabled();

▪ 當 Android裝置 NFC 功能未啟動時,呼叫該方法。

▪ protected abstract void onTagDiscovered(Intent intent);

▪ 當 Android裝置偵測到 Tag 時,呼叫該方法。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NfcActivity.java

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NfcActivity.java (Cont.)

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

NfcActivity.java (Cont.)

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

MainActivity說明▪ MainActivity是 Android 新建專案時預設的 Activity,代表 App執行時所啟動的第一個 Activity。

▪ 預設執行的 Activity 可在 AndroidManifest.xml中設定。

▪ 預設MainActivity所對應的 UI佈局為:

▪ res/layout/activity_main.xml

▪ 預設MainActivity 繼承於 android.app.Activity。請將繼承類別改為我們自定義的 NfcActivity。

▪ MainActivity為具象類別 (concrete class),因此必須覆寫 (override)NfcActivity所定義的抽象方法 (abstract method)。

▪ 在MainActivity所實作的方法內做適當的操作。

▪ onNfcFeatureNotFound()、onNfcStateEnabled()、onNfcStateDisabled()、onTagDiscovered()。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

MainActivity.java

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

測試應用程式1. 開啟 Connection Center

▪ Open NFC SDK for Android v4.4.1 (13751)/android_sdk/connection_center/Connection Center.exe

2. 開啟 NfcSimulator

▪ Open NFC SDK for Android v4.4.1 (13751)/android_sdk/nfcc_simulator/NfcSimulator.exe

3. 啟動 NFCDevice模擬器

▪ 確認模擬器已完成 Open NFC 設定

4. 執行應用程式

▪ 請注意開啟順序不同可能造成 NFC功能無法正常運作。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

執行 Hello NFC▪ HelloNFC專案點擊右鍵→ Run As → Android Application

▪ 選擇創建的 NFCDevice (或其他支援 NFC的 Android Device),將我們寫好的應用程式安裝至選取的 Android Device中。

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

Hello NFC!▪ 打開 NfcSimulator.exe選擇一 NFC Tag。

▪ 如被成功偵測,該 NFC Tag 呈現綠燈,裝置螢幕上顯示「Hello NFC!」字樣!

準備 Android 開發環境 / 安裝 Open NFC / Android NFC 開發基礎 / Hello NFC!

References▪ [1] V. Subtil, Near Field Communication with Android

Cookbook. Packt Publishing Ltd, 2014.

▪ [2] Android Developers, http://developer.android.com/

▪ [3] The Open NFC Project, http://open-nfc.org/

Thank You!