Вопрос или проблема
Как заставить два устройства на Android Communicate через NFC?
Я разрабатываю автономное приложение для носимых устройств на Android (Wear OS 4), в котором два устройства должны обменяться своими уникальными идентификаторами один раз (только для спаривания). Планировалось использовать NFC p2p для обмена данными, но недавно я обнаружил, что NFC p2p (Android Beam) устарел в API > 29. Следующим лучшим вариантом было использование API Nearby devices, но это потребовало бы создания дополнительных экранов (отправка, получение, список устройств и согласие) в приложении, дополнительных разрешений и большего расхода батареи, учитывая, что спаривание – это одноразовая функция. Есть ли какие-либо сторонние библиотеки, которые я могу использовать для непосредственного использования NFC p2p? Или с какими альтернативными подходами я должен продолжать? Я также планирую поддерживать устройства Tizen в будущем, так что использование Android Nearby ограничивает меня в этом.
Ответ или решение
Для настройки обмена данными между двумя носимыми устройствами на Android (Wear OS 4) с использованием NFC, вы правы в том, что API Android Beam для NFC P2P больше не рекомендуется, и использование Nearby Devices API может быть излишним для вашей задачи. Однако, для ваших нужд, есть несколько подходов, которые вы можете рассмотреть:
Подход 1: Использование NFC через стандартные API
-
Использование NFC Adapter:
Вы можете использовать стандартный классNfcAdapter
для реализации обмена данными по NFC. Вам нужно будет создать активность, которая будет обрабатывать интенты, когда устройства будут соединяться. Основной алгоритм будет включать:-
Настройка NFC:
Убедитесь, что на устройствах включен NFC, и получите экземплярNfcAdapter
. -
Создание
PendingIntent
:
Вам необходимо создатьPendingIntent
, чтобы ваше устройство могло обрабатывать RFID-сообщения при их получении. -
Создание меток:
ИспользуйтеNdefMessage
для создания сообщения с уникальным ID, который нужно обменять. - Обработка новых соединений:
Реализуйте методonNewIntent
в вашей активности для обработки входящих данных.
Пример кода может выглядеть следующим образом:
private void sendNfcMessage(String uniqueId) { NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); NdefMessage message = new NdefMessage( new NdefRecord[]{NdefRecord.createTextRecord("en", uniqueId)}); // Код для отправки сообщения... } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null && rawMsgs.length > 0) { NdefMessage msg = (NdefMessage) rawMsgs[0]; // Получаем сообщения // Обработка полученного сообщения } } }
-
Подход 2: Исследование сторонних библиотек
На данный момент нет многоизвестных сторонних библиотек, которые упростили бы работу с NFC P2P на Android. Однако, вы можете попробовать следующее:
- NFC Library: Попробуйте найти библиотеки, такие как
NfcUtils
, которые могут облегчить создание и обработку NFC-сообщений. Имейте в виду, что эта информация может быть устаревшей, и лучше проверить актуальные репозитории на GitHub.
Подход 3: Альтернативные технологии
Если ваши цели также включают поддержку Tizen устройств, рассмотрите возможность использования Bluetooth Low Energy (BLE) для одной операции обмена ID. BLE более кросс-платформен и не требует прямого взаимодействия, как в случае с NFC. Вы можете сделать одноразовое подключение, где устройства будут отправлять ID после соединения.
Заключение
При выборе подхода учтите, что NFC сильно зависит от окружающей среды и наличия физических устройств рядом. Если возможно, протестируйте оба метода и выберите наиболее удобный для конечного пользователя и легкий в реализации. Если ваше приложение должно работать на кросс-платформенной основе, BLE будет более перспективным решением.