Какой самый простой способ реализовать собственный менеджер NFC? - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над приложением Android, которое должно поддерживать базовые операции NFC как на обычных телефонах Android, так и на платежных терминалах на базе Android. Эти терминалы оснащены оборудованием для платежных операций, таких как печать счетов и считывание контактных банковских карт. Они также имеют сильно модифицированные прошивки по соображениям безопасности и не поддерживают стандартные API Android NFC. Вместо этого их производители предоставляют SDK для взаимодействия с оборудованием.

Я хочу реализовать пользовательский интерфейс диспетчера NFC, который бы выбирал различные методы для работы с NFC в зависимости от устройства, на котором выполняется приложение. Единственное, что мне нужно, - это чтение идентификатора тега NFC и авторизованное чтение блоков Mifare Classic.

Поскольку в SDK нет ничего похожего на диспетчеризацию переднего плана и класс Tag, мне нужно сделать что-то вроде этого:

interface MyNfcManager{
    fun startNfc()
    fun stopNfc()
}

interace MyNfcListener{
    fun onTagIdDiscovered(id: ByteArray)
    fun onMifareDataRead(data: ByteArray)
}

Есть ли какой-нибудь более простой способ реализовать его, чем писать с нуля и не углубляясь в низкоуровневые и нативные библиотеки?

Я обнаружил библиотеки, связанные с nfc:
https://github.com/grundid/nfctools
https://github.com/skjolber/external-nfc-api

Но я не могу найти из них ничего, что можно использовать

1 Ответ

1 голос
/ 06 ноября 2019

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

Большая часть содержимого NFC обрабатывается ОС на стандартном Android, и поэтому вы действительно ограничены упаковкой в ​​библиотеку, чтобы упростить выполнение нужных пользовательских операций внеспецификаций NFC.

Опять же, поскольку вы не указываете, для чего используется Mifare Classic, невозможно сказать, сделал ли кто-нибудь для этого библиотеку.

То же самое сПредоставляемая информация (или ее отсутствие) сводится к тому, чтобы самостоятельно обрабатывать эти очень нестандартные вещи, ниже приведен минимум, который вам нужно будет сделать, это не включает нативный код и аппаратные средства очень низкого уровня (что вы не сможетесделать на стандартном Android, если вы все равно не рутировали телефон): -

Так что в стандартном Android читайтеПоддержка Mifare Classic поддерживается, но на довольно низком уровне (вам нужно знать, какой блок читать и формат данных в блоке)

См. https://developer.android.com/reference/android/nfc/tech/MifareClassic

Способ Iподойдет к этому, чтобы попытаться идентифицировать работающее устройство, чтобы попробовать правильный метод доступа.

Один из способов идентификации состоит в том, чтобы попробовать стандартный метод Android и при возврате NfcAdapter.getDefaultAdapter(Context)

Если NULL, то используйте пользовательские команды SDK (поскольку я не ожидал, что пользовательское оборудование не будет зарегистрировано как NFC_Service с Android)

NOT NULL, затем создайте ожидающий Intent для ACTION_TECH_DISCOVERED

enableForegroundDispatch с этим намерением получать уведомления при чтении тега операционной системой

Затем в методе onNewIntent: -

Проверьте, что MifareClassic является поддерживаемой технологией (невсе оборудование поддерживает MifareClassic), вместо этого используйте NfcA.

...