Android NFC P2P模式開發
Android Application Development of NFC Peer-to-Peer Mode
Chun-Kai Wang (王雋凱)
IDSL - Dept. of IM - NTUST
NFC Peer-to-Peer Mode
▪ Description from Android Developers:
▪ “P2P mode, allowing the NFC device to exchange data with
other NFC peers; this operation mode is used by Android
Beam.”
2
Android Beam
▪ NFC P2P 模式是指兩個 NFC 裝置在接近彼此時完成資料的交換。
▪ 在 Android API 14+ 後,將兩個 Android 裝置之間透過 P2P 傳輸資料稱
為 Beam。
3
How to use Android Beam?
▪ 必須開啟手機的 Android Beam 功能。
▪ 要實現 Beam NDEF 訊息的應用程式 (發送端) 必須在前台,
不能是後台服務,不能處在螢幕鎖定狀態。
▪ 要接收 Beam 訊息的手機 (接收端),其螢幕不能處在螢幕
鎖定狀態。
▪ 要在 Android 手機裝置中完成 Beam 功能,其手機系統版
本必須是 API 14+。
▪ 兩個手機在進行彼此接近實現 Beam 功能時,Android 手
機畫面會顯示「Touch to Beam」,此時,使用者應該觸碰
需要 Beam NDEF 訊息的裝置。
4
Beaming NDEF Messages
▪ 使用 NfcAdapter 物件提供的兩種方法實現 Beam 功能。
▪ setNdefPushMessage()
1. 建立 NdefMessage 物件。
2. 呼叫 setNdefPushMessage() 傳入 NdefMessage 物件
▪ setNdefPushMessageCallback()
1. 在 Activity 中實作 CreateNdefMessageCallback 介面。
2. 呼叫 setNdefPushMessageCallback() 方法。
3. 在回呼函式 (createNdefMessage(NfcEvent)) 中實現 Beam Data。
5
• enableForegroundNdefPush() & disableForegroundNdefPush()
• 在 API 10 中加入 Android NFC P2P 方法,該方法已經在 API 14 被標示為
@Deprecated,被 setNdefPushMessage() 所取代。
• 可使用此方法支援較舊版本的Android NFC 裝置 (API 10 ~ 13)。
Beaming NDEF Messages (Cont.)
▪ public void setNdefPushMessage (NdefMessage message,
Activity activity, Activity... activities)
▪ 透過 Android Beam 發送靜態 NDEF Message。
▪ 在 Activity 呼叫該方法時,可以在生命週期 onDestroy() 之前,一般是在 onCreate()
中呼叫。
▪ 同時使用該方法和 setNdefPushMessageCallback() 方法時,
setNdefPushMessageCallback() 具有較高優先順序。
▪ 使用該方法時,如果 NdefMessage 為 null,則呼叫該方法的 Activity 的
setNdefPushMessage 功能將 disable。
6
Beaming NDEF Messages (Cont.)
▪ public void setNdefPushMessageCallback (
NfcAdapter.CreateNdefMessageCallback callback,
Activity activity, Activity... activities)
▪ 透過 Android Beam 發送經由 callback 函式所動態生成的 NDEF Message。
▪ 在 Activity 呼叫該方法時,可以在生命週期 onDestroy() 之前,一般是在 onCreate()
中呼叫。
▪ 同時使用該方法和 setNdefPushMessage() 方法時,該方法具有較高優先順序。
▪ 使用該方法時,如果 callback 為 null,則 Activity 的 NDEF Push 功能將 disable。
7
Beaming NDEF Messages (Cont.)
▪ setNdefPushMessage() vs. setNdefPushMessageCallback()
▪ 當應用程式 Activity 需要在任何時候都發送相同的 NDEF Message 時,可使用
setNdefPushMessage() 方法。
▪ 當應用程式 Activity 希望根據使用者不同的操作行為來進行發送時,可使用
setNdefPushMessageCallback() 方法。
▪ 當 Activity 中兩者方法都使用時,NDEF Message 只會在一處方法中被 Push,而
setNdefPushMessageCallback() 方法的優先順序高於 setNdefPushMessage() 方法。
▪ 在兩個 Android NFC 裝置接近時,如果發送端目前開啟的應用程式並沒有實現 Android
Beam 功能,系統會發送一筆預設的 NDEF Message。
▪ 如果想要阻止 Android 系統發送預設的 NDEF Message,可在 AndroidManifest.xml 中的
application 增加以下程式:
8
Receiving Beam Message
▪ 接收 Beam 訊息的方法與接收 Tag 訊息類似,實現步驟如下:
1. 在 Activity 中實作 onNewIntent(Intent) 方法,該方法會呼叫 setIntent(Intent)。
在使用 onNewIntent(Intent) 方法後,onResume() 方法會自動呼叫。
2. 在 Activity 的 onResume() 方法中,檢測目前訊息是否來自 Beam,如果是,
取得並處理該 NDEF 訊息。
3. 呼叫自定義的訊息解析函式,將取得的NDEF訊息解析並取得 Payload,
再對 Payload 進行進一步的 UI 操作。
9
protected void onNewIntent(Intent intent) {
// onResume gets called after this to handle the intent
setIntent(intent);
}
protected void onResume() {
super.onResume();
// Check to see that the Activity started due to an Android Beam
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
}
private void processIntent(Intent intent) {
// your code here...
}
Sample Project – AndroidBeamDemo
▪ Android Beam 的操作可以參考
Android 官方的 Sample Project。
▪ Eclipse
→ File
→ New
→ Other
→ Android
→ Android Sample Project
→ Android 4.x
→ AndroidBeamDemo
10
Thank You!

Android Application Development of NFC Peer-to-Peer Mode

  • 1.
    Android NFC P2P模式開發 AndroidApplication Development of NFC Peer-to-Peer Mode Chun-Kai Wang (王雋凱) IDSL - Dept. of IM - NTUST
  • 2.
    NFC Peer-to-Peer Mode ▪Description from Android Developers: ▪ “P2P mode, allowing the NFC device to exchange data with other NFC peers; this operation mode is used by Android Beam.” 2
  • 3.
    Android Beam ▪ NFCP2P 模式是指兩個 NFC 裝置在接近彼此時完成資料的交換。 ▪ 在 Android API 14+ 後,將兩個 Android 裝置之間透過 P2P 傳輸資料稱 為 Beam。 3
  • 4.
    How to useAndroid Beam? ▪ 必須開啟手機的 Android Beam 功能。 ▪ 要實現 Beam NDEF 訊息的應用程式 (發送端) 必須在前台, 不能是後台服務,不能處在螢幕鎖定狀態。 ▪ 要接收 Beam 訊息的手機 (接收端),其螢幕不能處在螢幕 鎖定狀態。 ▪ 要在 Android 手機裝置中完成 Beam 功能,其手機系統版 本必須是 API 14+。 ▪ 兩個手機在進行彼此接近實現 Beam 功能時,Android 手 機畫面會顯示「Touch to Beam」,此時,使用者應該觸碰 需要 Beam NDEF 訊息的裝置。 4
  • 5.
    Beaming NDEF Messages ▪使用 NfcAdapter 物件提供的兩種方法實現 Beam 功能。 ▪ setNdefPushMessage() 1. 建立 NdefMessage 物件。 2. 呼叫 setNdefPushMessage() 傳入 NdefMessage 物件 ▪ setNdefPushMessageCallback() 1. 在 Activity 中實作 CreateNdefMessageCallback 介面。 2. 呼叫 setNdefPushMessageCallback() 方法。 3. 在回呼函式 (createNdefMessage(NfcEvent)) 中實現 Beam Data。 5 • enableForegroundNdefPush() & disableForegroundNdefPush() • 在 API 10 中加入 Android NFC P2P 方法,該方法已經在 API 14 被標示為 @Deprecated,被 setNdefPushMessage() 所取代。 • 可使用此方法支援較舊版本的Android NFC 裝置 (API 10 ~ 13)。
  • 6.
    Beaming NDEF Messages(Cont.) ▪ public void setNdefPushMessage (NdefMessage message, Activity activity, Activity... activities) ▪ 透過 Android Beam 發送靜態 NDEF Message。 ▪ 在 Activity 呼叫該方法時,可以在生命週期 onDestroy() 之前,一般是在 onCreate() 中呼叫。 ▪ 同時使用該方法和 setNdefPushMessageCallback() 方法時, setNdefPushMessageCallback() 具有較高優先順序。 ▪ 使用該方法時,如果 NdefMessage 為 null,則呼叫該方法的 Activity 的 setNdefPushMessage 功能將 disable。 6
  • 7.
    Beaming NDEF Messages(Cont.) ▪ public void setNdefPushMessageCallback ( NfcAdapter.CreateNdefMessageCallback callback, Activity activity, Activity... activities) ▪ 透過 Android Beam 發送經由 callback 函式所動態生成的 NDEF Message。 ▪ 在 Activity 呼叫該方法時,可以在生命週期 onDestroy() 之前,一般是在 onCreate() 中呼叫。 ▪ 同時使用該方法和 setNdefPushMessage() 方法時,該方法具有較高優先順序。 ▪ 使用該方法時,如果 callback 為 null,則 Activity 的 NDEF Push 功能將 disable。 7
  • 8.
    Beaming NDEF Messages(Cont.) ▪ setNdefPushMessage() vs. setNdefPushMessageCallback() ▪ 當應用程式 Activity 需要在任何時候都發送相同的 NDEF Message 時,可使用 setNdefPushMessage() 方法。 ▪ 當應用程式 Activity 希望根據使用者不同的操作行為來進行發送時,可使用 setNdefPushMessageCallback() 方法。 ▪ 當 Activity 中兩者方法都使用時,NDEF Message 只會在一處方法中被 Push,而 setNdefPushMessageCallback() 方法的優先順序高於 setNdefPushMessage() 方法。 ▪ 在兩個 Android NFC 裝置接近時,如果發送端目前開啟的應用程式並沒有實現 Android Beam 功能,系統會發送一筆預設的 NDEF Message。 ▪ 如果想要阻止 Android 系統發送預設的 NDEF Message,可在 AndroidManifest.xml 中的 application 增加以下程式: 8
  • 9.
    Receiving Beam Message ▪接收 Beam 訊息的方法與接收 Tag 訊息類似,實現步驟如下: 1. 在 Activity 中實作 onNewIntent(Intent) 方法,該方法會呼叫 setIntent(Intent)。 在使用 onNewIntent(Intent) 方法後,onResume() 方法會自動呼叫。 2. 在 Activity 的 onResume() 方法中,檢測目前訊息是否來自 Beam,如果是, 取得並處理該 NDEF 訊息。 3. 呼叫自定義的訊息解析函式,將取得的NDEF訊息解析並取得 Payload, 再對 Payload 進行進一步的 UI 操作。 9 protected void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } protected void onResume() { super.onResume(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { processIntent(getIntent()); } } private void processIntent(Intent intent) { // your code here... }
  • 10.
    Sample Project –AndroidBeamDemo ▪ Android Beam 的操作可以參考 Android 官方的 Sample Project。 ▪ Eclipse → File → New → Other → Android → Android Sample Project → Android 4.x → AndroidBeamDemo 10
  • 11.