Написать сообщение NDEF несколько раз в один и тот же тег?

В Android, как только NFC-тег попадает в непосредственной близости от телефона, система передает намерение моему приложению, содержащему объекты, которые позволяют мне читать и записывать NDEF-сообщение этого тега. В частности, я могу писать в этот тег столько раз, сколько захочу, пока он все еще находится вблизи телефона. Код Java ниже дает вам представление о том, что я имею в виду:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
ndef.writeNdefMessage(/* some NDEF data */); // first write
ndef.writeNdefMessage(/* some NDEF data */); // second write
// further writes
ndef.writeNdefMessage(/* some NDEF data */); // n-th write

Могу ли я сделать то же самое в Windows Phone 8.x, или я могу выполнить только одну операцию записи сообщения NDEF в тег, а затем снова привести его в близость (отойти от поля RF и вернуться с тегом)?

1 ответ

Решение

Я могу писать в тег более одного раза, не отделяя его от телефона и не нажимая снова. Смотрите следующий код, например:

ProximityDevice device = ProximityDevice.GetDefault();
device.SubscribeForMessage("WriteableTag", WriteableTagHandler);


private void WriteableTagHandler(ProximityDevice sender, ProximityMessage message)
{
    var message1= Encoding.Unicode.GetBytes("http://1stUrl.com");
    var message2 = Encoding.Unicode.GetBytes("http://secondUrl.com");

    sender.PublishBinaryMessage("WindowsUri:WriteTag", message1.AsBuffer(), (s, e) =>
        {
            s.StopPublishingMessage(e);
            sender.PublishBinaryMessage("WindowsUri:WriteTag", message2.AsBuffer(), (se,r)=>
            {
                se.StopPublishingMessage(r);
            });
        });              
}

РЕДАКТИРОВАТЬ:

Я только что проверил с двумя устройствами, и на самом деле, есть возможность писать-читать более одного раза, не разделяя и снова не касаясь телефонов. См. Пример ниже, где одно устройство отправляет 5 сообщений, а другое получает их все:

Устройство 1 (отправитель):

ProximityDevice device = ProximityDevice.GetDefault();

device.DeviceArrived += (e) =>
    {
        for (int i = 1; i <= 5; i++)
        {
            e.PublishMessage("Windows.mySubType", "message " + i.ToString(), (s, m) =>
                {
                    s.StopPublishingMessage(m);
                });
        }
    };

Устройство 2 (приемник):

ProximityDevice device = ProximityDevice.GetDefault();

device.SubscribeForMessage("Windows.mySubType", (s, e) =>
    {
        Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show(e.DataAsString);
            });
    });
Другие вопросы по тегам