Android Beam

Android Beam — это технология Near Field Communication (NFC), представленная в Android 4.0, которая позволяет приложениям совместно использовать информацию через NFC, если они находятся поблизости друг от друга.

Схема, иллюстрирующая совместное использование двух устройств, которые находятся поблизости друг от друга

Android Beam поддерживает передачу сообщений через NFC, если два устройства находятся в диапазоне действия. Устройства, которые находятся друг от друга на расстоянии 4 см, могут обмениваться данными с помощью Android Beam. Действие на одном устройстве создает сообщение и указывает действие (или действия), которое может выполнять его принудительную отправку. Если указанное действие находится на переднем плане, а устройства находятся в диапазоне действия, Android Beam отправляет сообщение на второе устройство. На принимающем устройстве вызывается намерение, содержащее данные сообщения.

Android поддерживает два способа настройки сообщений с помощью Android Beam.

  • SetNdefPushMessage — перед инициацией Android Beam приложение может вызвать SetNdefPushMessage, чтобы указать NdefMessage выполнять отправку через NFC, и действие, которое отправляет его. Этот механизм лучше использовать, если сообщение не изменяется во время использования приложения.

  • SetNdefPushMessageCallback — когда Android Beam инициируется, приложение может реализовать обратный вызов для создания NdefMessage. Этот механизм позволяет отложить создание сообщений, пока устройства не будут находиться в диапазоне действия. Он поддерживает сценарии, в которых сообщение может изменяться в зависимости от того, что происходит в приложении.

В любом случае, чтобы отправлять данные с помощью Android Beam, приложение отправляет NdefMessage, упаковывая данные в несколько NdefRecords. Рассмотрим ключевые моменты, которые необходимо устранить, прежде чем активировать Android Beam. Во первых, мы будем работать со стилем обратного вызова создания NdefMessage.

Создание сообщения

Обратные вызовы можно зарегистрировать с помощью NfcAdapter в методе OnCreate действия. Например, если NfcAdapter с именем mNfcAdapter объявляется в действии как переменная класса, для создания обратного вызова можно написать следующий код, который будет формировать сообщение:

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, из которого NdefMessage можно извлечь следующим образом:

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