Как разрешить взаимодействие NFC только с устройствами, на которых запущено одно и то же приложение/активность

У меня есть приложение, использующее NFC. Я хочу ограничить взаимодействие NFC с другими устройствами, которые находятся в той же активности моего приложения.

Проблема

На данный момент, если я использую устройство A, на котором открыт Chrome, а на моем устройстве B запущено мое приложение, Chrome все равно обнаружит данные, отправленные моим приложением через NFC.

Как я могу сказать: «Если вы не используете мое приложение, вы не можете взаимодействовать со мной через NFC»?

@Override
public NdefMessage createNdefMessage(NfcEvent event)
{
    String stringOut = getMacAddress(this);
    byte[] bytesOut = stringOut.getBytes();

    NdefRecord ndefRecordOut = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), new byte[] {}, bytesOut);

    NdefMessage ndefMessageOut = new NdefMessage(ndefRecordOut);

    return ndefMessageOut;
}

В приведенном выше коде я отправляю сообщение NFC независимо от активности другого устройства. Может быть, есть способ дождаться ответа?


person J_Strauton    schedule 10.08.2015    source источник


Ответы (1)


Вы не можете. Сторона считывателя (метки)/получателя (одноранговая сеть) определяет, какое приложение обрабатывает событие NFC. В Android это делается с помощью фильтров намерений, системы диспетчеризации переднего плана и API режима чтения. Благодаря двум последним действиям переднего плана всегда может потребоваться приоритет над всеми другими приложениями. Нет ничего, что вы могли бы сделать, чтобы предотвратить это. Более того, одноранговый режим на Android (Android Beam) по существу допускает только однонаправленный обмен сообщениями, поэтому на самом деле вы не выполняете никакого рукопожатия.

Хотя напрямую связь с вашим приложением другими приложениями не предотвращается, тем не менее, есть несколько вариантов:

  1. Используйте шифрование, чтобы сделать данные, которые вы отправляете через NFC, непригодными для любого приложения-получателя, которому не известен ключ дешифрования.

  2. Используйте режим чтения с одной стороны + HCE с другой стороны. Таким образом, вы можете выполнить рукопожатие, установить аутентифицированный канал и т. д. И, используя собственный идентификатор приложения для стороны HCE, вы снизите вероятность того, что другое приложение даже попытается получить доступ к вашему приложению.

person Michael Roland    schedule 11.08.2015