Android Beam

Android Beam 是 Android 4.0 中引進的近場通信(NFC)技術,可讓應用程式在接近時透過 NFC 共用資訊。

Diagram illustrating two devices in close proximity sharing information

當兩個裝置在範圍內時,Android Beam 會透過NFC 推送訊息來運作。 彼此約 4cm 的裝置可以使用 Android Beam 共用數據。 一個裝置上的活動會建立訊息,並指定可以處理推送的活動(或活動)。 當指定的 Activity 位於前景且裝置位於範圍內時,Android Beam 會將訊息推送至第二個裝置。 在接收裝置上,會叫用意圖,其中包含訊息數據。

Android 支援使用 Android Beam 設定訊息的兩種方式:

  • SetNdefPushMessage - 在起始 Android Beam 之前,應用程式可以呼叫 SetNdefPushMessage 來指定要推送至 NFC 的 NdefMessage,以及推送它的活動。 當應用程式正在使用時,訊息不會變更時,最適合使用此機制。

  • SetNdefPushMessageCallback - 起始 Android Beam 時,應用程式可以處理回呼以建立 NdefMessage。 此機制可讓訊息建立延遲,直到裝置處於範圍內為止。 它支援訊息可能會根據應用程式中發生的情況而有所不同的案例。

在任一情況下,若要使用 Android Beam 傳送數據,應用程式會傳送 NdefMessage,以數 NdefRecords個 封裝數據。 讓我們看看觸發 Android Beam 之前,必須先解決的關鍵點。 首先,我們將使用建立 NdefMessage的回呼樣式。

建立訊息

我們可以在 Activity OnCreate 的 方法中向 NfcAdapter 註冊回呼。 例如,假設 NfcAdapter 具名 mNfcAdapter 宣告為 Activity 中的類別變數,我們可以撰寫下列程式代碼來建立將建構訊息的回呼:

mNfcAdapter = NfcAdapter.GetDefaultAdapter (this);
mNfcAdapter.SetNdefPushMessageCallback (this, this);

實作 NfcAdapter.ICreateNdefMessageCallback的活動會傳遞至 SetNdefPushMessageCallback 上述方法。 起始 Android Beam 時,系統會呼叫 CreateNdefMessage,活動可以從中建構 NdefMessage ,如下所示:

public NdefMessage CreateNdefMessage (NfcEvent evt)
{
    DateTime time = DateTime.Now;
    var text = ("Beam me up!\n\n" + "Beam Time: " +
        time.ToString ("HH:mm:ss"));
    NdefMessage msg = new NdefMessage (
        new NdefRecord[]{ CreateMimeRecord (
            "application/com.example.android.beam",
            Encoding.UTF8.GetBytes (text)) });
        } };
    return msg;
}

public NdefRecord CreateMimeRecord (String mimeType, byte [] payload)
{
    byte [] mimeBytes = Encoding.UTF8.GetBytes (mimeType);
    NdefRecord mimeRecord = new NdefRecord (
        NdefRecord.TnfMimeMedia, mimeBytes, new byte [0], payload);
    return mimeRecord;
}

接收訊息

在接收端,系統會使用 動作叫用 ActionNdefDiscovered Intent,我們可以從中擷取 NdefMessage,如下所示:

IParcelable [] rawMsgs = intent.GetParcelableArrayExtra (NfcAdapter.ExtraNdefMessages);
NdefMessage msg = (NdefMessage) rawMsgs [0];

如需使用Android Beam的完整程式代碼範例,如下列螢幕快照所示,請參閱 範例庫中的Android Beam示範

Example screenshots from the Android Beam demo