Compartilhar via


Beam do Android

O Android Beam é uma tecnologia NFC (Near Field Communication) introduzida no Android 4.0 que permite que os aplicativos compartilhem informações por NFC quando estão próximos.

Diagrama ilustrando dois dispositivos próximos compartilhando informações

O Android Beam funciona enviando mensagens por NFC quando dois dispositivos estão no alcance. Dispositivos a cerca de 4cm uns dos outros podem compartilhar dados usando o Android Beam. Uma Atividade em um dispositivo cria uma mensagem e especifica uma Atividade (ou Atividades) que pode lidar com o envio por push. Quando a atividade especificada estiver em primeiro plano e os dispositivos estiverem no alcance, o Android Beam enviará a mensagem para o segundo dispositivo. No dispositivo receptor, uma Intenção é invocada contendo os dados da mensagem.

O Android suporta duas maneiras de definir mensagens com o Android Beam:

  • SetNdefPushMessage - Antes do Android Beam ser iniciado, um aplicativo pode chamar SetNdefPushMessage para especificar um NdefMessage para enviar por push sobre NFC e a Atividade que está empurrando-o. Esse mecanismo é melhor usado quando uma mensagem não é alterada enquanto um aplicativo está em uso.

  • SetNdefPushMessageCallback - Quando o Android Beam é iniciado, um aplicativo pode lidar com um retorno de chamada para criar um NdefMessage. Esse mecanismo permite que a criação de mensagens seja adiada até que os dispositivos estejam no alcance. Ele oferece suporte a cenários em que a mensagem pode variar com base no que está acontecendo no aplicativo.

Em ambos os casos, para enviar dados com o Android Beam, um aplicativo envia um NdefMessage, empacotando os dados em vários NdefRecords. Vamos dar uma olhada nos principais pontos que devem ser abordados antes de podermos acionar o Android Beam. Primeiro, trabalharemos com o estilo de retorno de chamada de criar um NdefMessagearquivo .

Criando uma mensagem

Podemos registrar retornos de chamada com um NfcAdapter no método da OnCreate Atividade. Por exemplo, supondo que um NfcAdapter nome mNfcAdapter seja declarado como uma variável de classe na Atividade, podemos escrever o seguinte código para criar o retorno de chamada que construirá a mensagem:

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

A Atividade, que implementa NfcAdapter.ICreateNdefMessageCallback, é passada para o SetNdefPushMessageCallback método acima. Quando o Android Beam for iniciado, o sistema chamará CreateNdefMessage, a partir do qual a Atividade poderá construir um NdefMessage conforme mostrado abaixo:

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;
}

Recebendo uma mensagem

No lado receptor, o sistema invoca uma Intenção com a ActionNdefDiscovered ação, da qual podemos extrair o NdefMessage da seguinte maneira:

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